我正在开发一个(相当大的)现有单线程 C 应用程序。在这种情况下,我修改了应用程序以执行一些非常少的额外工作,包括每次调用特殊函数时递增计数器(此函数被调用约 80.000 次)。该应用程序在运行 64 位 Linux 内核 3.2.0-31-generic 和 -O3 选项的 Ubuntu 12.04 上编译。
令人惊讶的是,代码的检测版本运行得更快,我正在调查原因。我测量执行时间clock_gettime(CLOCK_PROCESS_CPUTIME_ID)
并获得有代表性的结果,我报告了超过 100 次运行的平均执行时间值。此外,为了避免来自外界的干扰,我尽可能尝试在没有任何其他应用程序运行的系统中启动应用程序(附带说明,因为 CLOCK_PROCESS_CPUTIME_ID 返回进程时间而不是挂钟时间,其他应用程序“应该”在理论上只影响缓存而不直接影响进程执行时间)
我怀疑“指令缓存效应”,也许稍微大一点(几个字节)的检测代码在缓存中的适合度不同且更好,这个假设是否可以想象?我尝试使用 valegrind --tool=cachegrind 进行一些缓存调查,但不幸的是,检测版本比初始版本具有更多的缓存未命中(因为它似乎是合乎逻辑的)。
欢迎任何关于这个主题的提示和可能有助于找出为什么检测代码运行得更快的想法(一些 GCC 优化在一种情况下可用,而在另一种情况下不可用,为什么?,...)