使用 CPU 计数器与 gettimeofday?
Posted
技术标签:
【中文标题】使用 CPU 计数器与 gettimeofday?【英文标题】:Using CPU counters versus gettimeofday? 【发布时间】:2013-03-25 19:43:30 【问题描述】:我想使用 Linux 分析 C 中的一些代码。我通常只做通常的gettimeofday()
功能,它们易于安装、易于理解且可移植。有人问我为什么不使用 CPU 计数器或 RDTSC 来分析代码,但虽然我知道 RDTSC 可能更精确,但我不能赞成或反对其中一个。所以,我的问题是:在其他条件相同的情况下,人们会使用通常的时间函数或 RDTSC 来分析代码吗?
【问题讨论】:
有什么理由不使用像gprof
这样的分析工具?
"POSIX.1-2008 将gettimeofday()
标记为已过时,建议改用clock_gettime(2)
。"
仅分析并行代码的一小部分...您必须修补 gprof 以分析线程。 perf 会更好,但您不能对代码的各个部分进行计时。
@DanielFischer:过时意味着它不起作用? “过时”是什么意思?
RDTSC 使用起来稍微困难一些,因为它不是标准的,您需要弄清楚每单位时间有多少“滴答声”。
【参考方案1】:
CPU 计数器和挂钟是用于不同目的的不同工具。
何时使用挂钟:
当您想以标准时间单位(例如秒)测量时间时。如果您想测量 X 任务需要多长时间,请使用挂钟。
例子:
clock()
gettimeofday()
clock_gettime(2)
等等...
何时使用 RDTSC:
如果您希望以尽可能高的精度测量两个不同任务的相对时间,那么 RDTSC 可能是合适的。
RDTSC 测量自 CPU 启动以来经过的伪周期数。通常(但不总是),这等于处理器的 CPU 时钟速度。但是,如果不根据挂钟实际测量,就很难确定“每秒滴答声”的确切数量。
但是,RDTSC 的开销与时间函数的开销一样低。因此,当您将一种实现与另一种实现进行比较以确定哪个实现更快时,它非常适合微优化。 (相对于它需要多少绝对时间)
其他注意事项:
在大多数情况下,使用挂钟可以很好地完成大多数基准测试目的。所以 RDTSC 的使用非常有限。尽可能坚持使用标准化函数。 高精度挂钟通常在 RDTSC 之上实现。因此,如果您尝试使用 RDTSC 对挂钟时间进行高精度测量,那么您只是在重新发明***。附带说明一下,我使用 RDTSC 来查看 RNG 并作为我的超频基准测试的反作弊措施。
【讨论】:
小提示:clock_gettime() 支持不同的时钟以适应两种用例(参见例如 CLOCK_MONOTONIC)【参考方案2】:对于大多数用途,我会使用clock_gettime
。正如其他人所说,gettimeofday
已过时,其分辨率太低,无法测量低于 10000 个周期范围内的时间。请注意,clock_gettime
可能有系统调用开销(内核进入/退出成本)反映在您采取的差异中,但在现代 x86_64 Linux 系统上,clock_gettime
实际上完全在用户空间中运行并使用rdtsc
在引擎盖下,所以它最终只是rdtsc
的一个更便携、更简洁的抽象版本。
【讨论】:
是的。 RDTSC 只是“全世界的 VAX”风格编程的另一种形式,只是英特尔风格。尽可能坚持使用便携式界面。 所以,为了确保gettimeofday()
在功能上等同于 clock_gettime()
和 CLOCK_MONOTONIC
?
不,gettimeofday
对应于CLOCK_REALTIME
。这是避免gettimeofday
的另一个原因;如果时钟被重置,测量间隔可能会出错。即使时钟重置,clock_gettime
和 CLOCK_MONOTONIC
也能可靠地工作。如果您只想测量进程花费的 CPU 时间,不包括可能抢占它的其他进程,也可以选择 CLOCK_PROCESS_CPUTIME_CLOCKID
。以上是关于使用 CPU 计数器与 gettimeofday?的主要内容,如果未能解决你的问题,请参考以下文章
获取与 powershell 计数器一起使用的 cpu 百分比