【发布时间】:2011-03-06 13:35:03
【问题描述】:
我目前正在开发一种非常快速的算法,其中一部分是非常快速的扫描仪和统计功能。 在这个任务中,我追求任何性能优势。 因此,我也对保持代码“多线程”友好感兴趣。
现在的问题: 我注意到将一些非常频繁访问的变量和数组放入“全局”或“静态本地”(同样如此),会有可衡量的性能优势(在 +10% 的范围内)。 我试图了解原因并找到解决方案,因为我宁愿避免使用这些类型的分配。 请注意,我不认为差异来自“分配”,因为在堆栈上分配一些变量和小数组几乎是瞬时的。我相信区别来自“访问”和“修改”数据。
在此搜索中,我从 stackoverflow 中找到了这篇旧帖子: C++ performance of global variables
但我对那里的答案感到非常失望。很少有解释,主要是在咆哮“你不应该那样做”(嘿,这不是问题!)和非常粗略的陈述,比如“它不会影响性能”,这显然是不正确的,因为我正在用精确的方法测量它基准工具。
如上所述,我正在寻找一个解释,如果存在的话,这个问题的解决方案。到目前为止,我感觉计算本地(动态)变量的内存地址比全局(或本地静态)的成本要高一些。也许类似于 ADD 操作差异。但这无助于寻找解决方案...
【问题讨论】:
-
您是否将每次重新计算该值所需的时间与从全局变量中检索该值所需的时间进行比较?是的,这总是会更快。但是没有理由说全局变量会比局部变量快。我不确定这里的问题是什么。
-
我正在比较收集统计数据所需的时间,使用相同的代码,但一个将结果存储/更新到本地结构中,另一个使用全局(或本地静态)结构。 “本地静态”获胜,放下手,其他一切都一样。
-
在没有看到实际代码的情况下很难说出任何事情。我们甚至不知道您要替换什么机制。
-
不确定“提供源代码”是否有用,但是,如果一个例子有帮助,让我们说这个:“ int stats[256]; while (p
-
@Cyan:您是否对您给出的特定示例进行了基准测试?它是否显示了 10% 的性能差异?如果不是,那么它不是一个有用的例子。反汇编真实代码,查看访问变量的部分,看看它是否可以合理地占运行时的 10%。如果不是,那么一定有一些微妙的连锁效应,这可能是您的真实代码所特有的。如果您无法生成显示问题的示例,那么除非原因非常明显,否则您将很难分析其性能,否则任何人都将很难。它似乎不在这里:-)
标签: c performance static benchmarking global