Cya*_*yan 14 c performance benchmarking static global
我目前正在开发一种非常快速的算法,其中一部分是极快的扫描和统计功能.在这个任务中,我追求任何性能优势.因此,我也有兴趣保持代码"多线程"友好.
现在的问题是:我注意到将一些非常频繁访问的变量和数组放入"全局"或"静态本地"(它们都是相同的),有一个可衡量的性能优势(在+ 10%的范围内) .我试图理解为什么,并找到一个解决方案,因为我宁愿避免使用这些类型的分配.请注意,我不认为差异来自"分配",因为在堆栈上分配一些变量和小数组几乎是瞬间完成的.我相信差异来自"访问"和"修改"数据.
在这次搜索中,我发现了stackoverflow的这篇旧帖子: 全局变量的C++性能
但我对那里的答案感到非常失望.很少解释,大多是咆哮"你不应该这样做"(嘿,这不是问题!)和非常粗略的陈述,如'它不影响性能',这显然是不正确的,因为我用精确测量它基准工具.
如上所述,我正在寻找解释,并且,如果存在,则解决此问题.到目前为止,我已经感觉到计算本地(动态)变量的内存地址比全局(或本地静态)花费更多.也许类似于ADD操作差异.但这无助于找到解决方案......
如果它们是POD类型,那么创建局部变量就可以完全免费.您可能会溢出缓存行,其中包含太多堆栈变量或其他类似的基于对齐的原因,这些原因对您的代码而言非常具体.我经常发现非局部变量会显着降低性能.
这实际上取决于您的编译器,平台和其他细节.但是,我可以描述一个全局变量更快的场景.
在许多情况下,全局变量处于固定偏移量.这允许生成的指令直接简单地使用该地址.(有些东西MOV AX,[MyVar]
.)
但是,如果您有一个相对于当前堆栈指针或类或数组成员的变量,则需要一些数学运算来获取数组的地址并确定实际变量的地址.
显然,如果你需要在你的全局变量上放置某种互斥量以保持线程安全,那么你几乎肯定会失去任何性能增益.
归档时间: |
|
查看次数: |
9073 次 |
最近记录: |