我有一个辅助功能,可以完成一些非常昂贵的操作。
我正在尝试分析算法的主要部分,但这个辅助函数会被调用。因此,测量的时间考虑了辅助功能的时间。
为了解决这个问题,我决定设置并恢复时间,以便辅助功能看起来是即时的。我定义了以下宏:
#define TIME_SAVE struct timeval _time_tv; gettimeofday(&_time_tv,NULL);
#define TIME_RESTORE settimeofday(&_time_tv,NULL);
。 。 。并将它们用作辅助功能的第一行和最后一行。但是出于某种原因,辅助功能的开销仍然包括在内!
所以,我知道这是一个混乱的解决方案,所以我继续前进,但我仍然很好奇为什么这个想法不起作用。 有人可以解释一下原因吗?
答案 0 :(得分:4)
如果您坚持以这种方式进行分析,不设置系统时钟。如果您有权这样做,这将打破各种各样的事情。基本上你应该忘记你曾经听说过settimeofday
。您要做的是在要从测量中排除的函数之前和之后调用gettimeofday
,并计算差异。然后,您可以从总体时间中排除在此功能中花费的时间。
话虽如此,这种“剖析”的方法存在很大缺陷,因为gettimeofday
可能(1)与你想要测量的相比需要相当长的时间,并且(2)可能涉及转换到内核空间,这会对程序的缓存一致性造成严重损害。第二个问题是,在尝试观察程序的性能特征时,实际上会改变它们,这是最成问题的。
你真正应该做的是忘记这种分析(gettimeofday
甚至是gcc的-pg
/ gmon分析),而是使用oprofile
或perf
或类似的东西。这些现代的分析技术基于定期对指令指针和堆栈信息进行统计采样而工作;您的程序自己的代码根本不会被修改,所以它的行为尽可能接近于没有运行探查器的行为。
答案 1 :(得分:0)
可能会出现几种可能性。一个是Linux试图保持时钟准确,并且可以对时钟进行平滑调整'或以其他方式修复'试图在系统内保持平稳的时间感。如果您正在运行NTP,它还会尝试保持合理的时间感。
我的方法是不修改时钟,而是跟踪进程的每个部分所消耗的时间。对昂贵部分的调用将被累积(通过获取进入和退出时的gettimeofday之间的差异,并累积)并从总时间中减去该调用。对于更高级的方法还有其他可能性,我确定。