c - 全局变量性能效果(c、c++)

标签 c performance static benchmarking global

我目前正在开发一种非常快速的算法,其中一部分是非常快速的扫描器和统计功能。 在这个任务中,我追求任何性能优势。 因此,我也对保持代码的“多线程”友好感兴趣。

现在开始提问: 我注意到将一些非常频繁访问的变量和数组放入“全局”或“静态本地”(作用相同),会带来可衡量的性能优势(在 +10% 的范围内)。 我试图理解为什么,并找到解决方案,因为我宁愿避免使用这些类型的分配。 请注意,我不认为差异来自“分配”,因为在堆栈上分配一些变量和小数组几乎是瞬时的。我相信区别来自“访问”和“修改”数据。

在这次搜索中,我发现了这篇来自 stackoverflow 的旧帖子: C++ performance of global variables

但我对那里的答案感到非常失望。很少解释,主要是提示“你不应该那样做”(嘿,这不是问题!)和非常粗略的陈述,比如“它不会影响性能”,这显然是不正确的,因为我正在精确地测量它基准测试工具。

如上所述,我正在寻找一个解释,如果存在的话,我正在寻找这个问题的解决方案。到目前为止,我感觉计算局部(动态)变量的内存地址比全局(或局部静态)变量花费更多。也许类似于 ADD 操作差异。但这无助于找到解决方案...

最佳答案

这实际上取决于您的编译器、平台和其他细节。但是,我可以描述一种全局变量更快的场景。

在许多情况下,全局变量处于固定偏移量。这允许生成的指令直接使用该地址。 (类似于 MOV AX,[MyVar]。)

但是,如果您有一个相对于当前堆栈指针或类或数组成员的变量,则需要一些数学运算来获取数组的地址并确定实际变量的地址。

显然,如果您需要在全局变量上放置某种互斥锁以保持其线程安全,那么您几乎肯定会失去任何性能增益。

关于c - 全局变量性能效果(c、c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5210787/

相关文章:

mysql - codeigniter , mysql查询性能问题

java - 为什么我不能使用静态上下文中的 "super"变量,即使 "super"指的是父类而不是类实例,这与 "this"不同?

c - 无法释放所有已用内存

C 程序未完成所有步骤

mysql - 第一个查询行为不稳定

c# - 用于静态泛型类?

java - static() 方法(没有任何声明)

c - Gcc 纯/常量函数和 longjmp

c - 哪种计算 sockaddr_un 结构大小的方法是正确的?

mysql - 关于设计可伸缩性数据库,我应该知道些什么?