我想使用Linux在C中分析一些代码。我通常只使用通常的gettimeofday()
函数,它们很容易放入,可理解和可移植。我曾经有人问我为什么不使用CPU计数器或RDTSC来分析代码,但是虽然我知道RDTSC可能更精确,但我不能赞成或反对其中一个。所以,我的问题是:在其他条件相同的情况下,人们会使用通常的时间函数或RDTSC来分析代码吗?
答案 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来查看RNG,并将其作为我的超频基准测试的反作弊措施。