0

我有一个辅助功能,可以执行一些非常昂贵的操作。

我正在尝试分析算法的主要部分,但这个辅助函数在内部被调用了很多。因此,测量的时间考虑了辅助功能的时间。

为了解决这个问题,我决定设置和恢复时间,使辅助功能看起来是瞬时的。我定义了以下宏:

#define TIME_SAVE struct timeval _time_tv; gettimeofday(&_time_tv,NULL);
#define TIME_RESTORE settimeofday(&_time_tv,NULL);

. . . 并将它们用作辅助函数的第一行和最后一行。但是,出于某种原因,辅助功能的开销仍然包括在内!

所以,我知道这是一个混乱的解决方案,所以我继续前进,但我仍然很好奇为什么这个想法不起作用。有人可以解释为什么吗?

4

2 回答 2

4

如果您坚持以这种方式进行分析,请不要设置系统时钟。如果您有权这样做,这将破坏各种事情。基本上你应该忘记你曾经听说过的settimeofday. 您要做的是gettimeofday在要从测量中排除的函数之前和之后调用,并计算差异。然后,您可以从总时间中排除在此函数中花费的时间。

话虽如此,整个“分析”方法存在很大缺陷,因为gettimeofday可能(1)与您尝试测量的内容相比需要大量时间,并且(2)可能涉及到内核空间的转换,这将做对程序的缓存一致性造成严重损害。第二个问题是最成问题的,即在试图观察程序的性能特征时实际上会改变它们。

你真正应该做的是忘记这种分析(gettimeofday甚至是 gcc 的-pg/gmon 分析),而是使用oprofileorperf或类似的东西。这些现代分析技术基于定期对指令指针和堆栈信息进行统计采样而工作;您的程序自己的代码根本没有被修改,因此它的行为尽可能接近在没有运行探查器的情况下的行为。

于 2012-04-29T06:28:33.723 回答
0

有几种可能发生。一是Linux试图保持时钟准确,并且对时钟的调整可能是“平滑的”或“固定的”,以试图在系统内保持平滑的时间感。如果您正在运行 NTP,它也会尝试保持合理的时间感。

我的方法是不修改时钟,而是跟踪流程每个部分所消耗的时间。对昂贵部分的调用将被累积(通过获取进入和退出时 gettimeofday 之间的差异并累积)并从总时间中减去。我敢肯定,还有其他更高级的方法的可能性。

于 2012-04-29T06:23:35.990 回答