Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CPU计数器与使用gettimeofday?_C_Linux_Profiling - Fatal编程技术网

使用CPU计数器与使用gettimeofday?

使用CPU计数器与使用gettimeofday?,c,linux,profiling,C,Linux,Profiling,我想介绍一些使用Linux的C代码。我通常只做通常的gettimeofday()函数,它们很容易放入、理解和移植。我曾有人问我为什么不使用CPU计数器或RDTSC来分析代码,但尽管我知道RDTSC可能更精确,但我不能支持或反对其中一个。所以,我的问题是:在所有其他条件相同的情况下,人们会使用通常的时间函数还是RDTSC来分析代码?在大多数情况下,我会使用clock\u gettime。正如其他人所说,gettimeofday已经过时,它的分辨率太低,无法测量10000次循环范围内的时间。请注意,

我想介绍一些使用Linux的C代码。我通常只做通常的
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测量CPU启动后经过的伪周期数。通常(但并非总是),这等于处理器的CPU时钟速度。但是,要确定“每秒滴答声”的确切数量,不根据挂钟实际测量是不容易的

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


其他需要注意的事项:

  • 在大多数情况下,大多数基准测试目的都可以用挂钟很好地完成。因此,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)