2

我想使用 Linux 分析 C 中的一些代码。我通常只做通常的gettimeofday()功能,它们易于安装、易于理解和便携。有人问我为什么不使用 CPU 计数器或 RDTSC 来分析代码,但尽管我知道 RDTSC 可能更精确,但我不能赞成或反对其中一个。所以,我的问题是:在其他条件相同的情况下,人们会使用通常的时间函数或 RDTSC 来分析代码吗?

4

2 回答 2

3

对于大多数目的,我会使用clock_gettime. 正如其他人所说,gettimeofday它已经过时并且其分辨率太低,无法测量低于 10000 个周期范围内的时间。请注意,您所采用的差异clock_gettime 可能会反映出系统调用开销(内核进入/退出成本),但在现代 x86_64 Linux 系统上,clock_gettime实际上完全在用户空间中运行并在后台使用rdtsc,因此它最终只是一个更便携、更干净的抽象版本rdtsc

于 2013-03-25T20:11:32.520 回答
3

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

何时使用挂钟:

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

例子:

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

何时使用 RDTSC:

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

RDTSC 测量自 CPU 启动以来经过的伪周期数。通常(但不总是),这等于处理器的 CPU 时钟速度。但是,如果不根据挂钟实际测量它,就很难确定“每秒滴答声”的确切数量。

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


其他需要注意的事项:

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

附带说明一下,我使用 RDTSC 既可以查看 RNG,也可以作为我的超频基准测试的反作弊措施。

于 2013-03-25T20:15:43.727 回答