使用CPU计数器与gettimeofday?

时间:2013-03-25 19:43:31

标签: c linux profiling

我想使用Linux在C中分析一些代码。我通常只使用通常的gettimeofday()函数,它们很容易放入,可理解和可移植。我曾经有人问我为什么不使用CPU计数器或RDTSC来分析代码,但是虽然我知道RDTSC可能更精确,但我不能赞成或反对其中一个。所以,我的问题是:在其他条件相同的情况下,人们会使用通常的时间函数或RDTSC来分析代码吗?

2 个答案:

答案 0 :(得分:3)

对于大多数用途,我会使用clock_gettime。正如其他人所说的那样,gettimeofday已过时,其分辨率太低,无法在10000以下的循环范围内进行测量。请注意,clock_gettime 可能在您所采取的差异中反映了系统调用开销(内核入口/出口成本),但在现代x86_64 Linux系统上,clock_gettime实际上在用户空间中完全运行,在引擎盖下使用rdtsc,因此它最终只是rdtsc的一个更加便携,干净抽象的版本。

答案 1 :(得分:3)

CPU计数器和挂钟是用于不同目的的不同工具。

何时使用挂钟:

当您想要以标准时间单位(例如秒)测量时间时。如果要测量X任务所需的时间,请使用挂钟。

示例:

  • clock()
  • gettimeofday()
  • clock_gettime(2)
  • 等...

何时使用RDTSC:

如果您希望以尽可能高的精度测量两个不同任务的相对次,那么RDTSC可能是合适的。

RDTSC测量自CPU启动以来经过的伪循环数。通常(但并非总是),这等于处理器的CPU时钟速度。但是,如果没有实际根据挂钟进行测量,就不容易确定“每秒滴答数”的确切数量。

但是,RDTSC的开销与低于时间函数的开销一样低。因此,当您将一个实现与另一个实现进行比较以确定更快时,它非常适合微优化。 (而不是需要多少绝对时间)


其他注意事项:

  • 在大多数情况下,使用挂钟可以很好地完成大多数基准测试目的。所以RDTSC的使用非常有限。尽可能坚持标准化功能。
  • 高精度挂钟通常在RDTSC之上实现。因此,如果您正在尝试使用RDTSC来获得高精度的墙壁时间测量,那么您只需要重新发明轮子。

作为旁注,我使用RDTSC来查看RNG,并将其作为我的超频基准测试的反作弊措施。