使用CPU计数器与使用gettimeofday?
我想介绍一些使用Linux的C代码。我通常只做通常的使用CPU计数器与使用gettimeofday?,c,linux,profiling,C,Linux,Profiling,我想介绍一些使用Linux的C代码。我通常只做通常的gettimeofday()函数,它们很容易放入、理解和移植。我曾有人问我为什么不使用CPU计数器或RDTSC来分析代码,但尽管我知道RDTSC可能更精确,但我不能支持或反对其中一个。所以,我的问题是:在所有其他条件相同的情况下,人们会使用通常的时间函数还是RDTSC来分析代码?在大多数情况下,我会使用clock\u gettime。正如其他人所说,gettimeofday已经过时,它的分辨率太低,无法测量10000次循环范围内的时间。请注意,
gettimeofday()
函数,它们很容易放入、理解和移植。我曾有人问我为什么不使用CPU计数器或RDTSC来分析代码,但尽管我知道RDTSC可能更精确,但我不能支持或反对其中一个。所以,我的问题是:在所有其他条件相同的情况下,人们会使用通常的时间函数还是RDTSC来分析代码?在大多数情况下,我会使用clock\u gettime
。正如其他人所说,gettimeofday
已经过时,它的分辨率太低,无法测量10000次循环范围内的时间。请注意,clock_-gettime
可能会有系统调用开销(内核进入/退出成本),这反映在您所采取的差异上,但在现代x86_64 Linux系统上,clock_-gettime
实际上完全在用户空间中运行,并在引擎盖下使用rdtsc
,因此它的便携性更强,清晰抽象的rdtsc版本CPU计数器和挂钟是用于不同目的的不同工具
何时使用挂钟:
当您要以标准时间单位(如秒)测量时间时。如果您想测量X任务所需的时间,请使用挂钟
示例:
clock()
gettimeofday()
clock\u gettime(2)
- 等等
其他需要注意的事项:
- 在大多数情况下,大多数基准测试目的都可以用挂钟很好地完成。因此,RDTSC的使用非常有限。尽可能使用标准化功能
- 高精度挂钟通常在RDTSC上实现。因此,如果你试图使用RDTSC来获得高精度的壁面时间测量,你只是在重新发明轮子
作为补充说明,我使用RDTSC查看RNG,并将其作为防作弊措施用于我的超频基准测试。是否有理由不使用像
gprof
这样的探查器工具?“POSIX.1-2008将gettimeofday()
标记为过时,建议改用clock\u gettime(2)
。”仅分析并行代码的短部分。。。您必须为分析线程修补gprof。性能会更好,但您不能对代码的各个部分计时。@DanielFischer:过时意味着它不工作?“过时”是什么意思?RDTSC稍微难以使用,因为它不是标准的,您需要计算出每单位时间有多少个“滴答声”。是的。RDTSC只是“全世界的一个VAX”风格编程的另一种形式,只是英特尔风格。尽可能使用便携式接口。因此,只要确保,gettimeofday()
在功能上等同于clock\u gettime()
具有clock\u单调性
?不,gettimeofday
对应于clock\u REALTIME
。这是避免使用gettimeofday
的另一个原因;如果时钟复位,测量间隔很可能是错误的clock_gettime
和clock_单调
即使时钟被重置,也能可靠工作。如果您只想测量进程所花费的cpu时间,而不包括可能抢占它的其他进程,您也可以选择CLOCK\u PROCESS\u CPUTIME\u CLOCKID
。请注意:CLOCK\u gettime()支持不同的时钟以适应这两种使用情形(参见例如CLOCK\u MONOTONIC)