【发布时间】:2012-09-22 03:33:30
【问题描述】:
我正在开发一个(相当大的)现有单线程 C 应用程序。在这种情况下,我修改了应用程序以执行一些非常少的额外工作,包括每次调用特殊函数时递增计数器(此函数被调用约 80.000 次)。该应用程序在 Ubuntu 12.04 上编译,运行 64 位 Linux 内核 3.2.0-31-generic,带有 -O3 选项。
令人惊讶的是,经过检测的代码版本运行速度更快,我正在调查原因。我使用 clock_gettime(CLOCK_PROCESS_CPUTIME_ID) 测量执行时间并获得具有代表性的结果,我报告了超过 100 次运行的平均执行时间值。此外,为了避免来自外界的干扰,我尽可能尝试在没有任何其他应用程序运行的系统中启动应用程序(附带说明,因为 CLOCK_PROCESS_CPUTIME_ID 返回进程时间而不是挂钟时间,其他应用程序“应该”在理论上只影响缓存而不直接影响进程执行时间)
我怀疑“指令缓存效应”,也许稍微大一点(几个字节)的检测代码在缓存中的适应方式不同且更好,这个假设可以想象吗?我尝试使用 valegrind --tool=cachegrind 进行一些缓存调查,但不幸的是,检测后的版本比初始版本有更多的缓存未命中(似乎合乎逻辑)。
欢迎任何有关此主题的提示和想法,可能有助于找出检测代码运行速度更快的原因(某些 GCC 优化在一种情况下可用,而在另一种情况下不可用,为什么?,...)
【问题讨论】:
-
在不知道任何代码的情况下,很难对您的问题给出明确的答案。
-
@FUZxxl:我认为这就是为什么问题是“我在做我的工作时可以考虑哪些因素”,而不是通常的 SO 格式,“请为我做我的工作”;-)
-
@FUZxxl 正如史蒂夫·杰索普所说,在这里提供代码很困难,因为它很大,我正在寻求有关方向的帮助而不是答案,说“问题就在这里文件 mem.c 的 345”。如果您有任何提示,请随时添加答案。
-
@ArjunShankar ~5% 执行约 7 秒。
-
@ManuelSelva - Inlining isn't always a win。有时它会降低性能。无论如何,我的评论大多是疯狂的猜测。
标签: c linux performance gcc