【发布时间】:2011-09-21 21:34:40
【问题描述】:
您好,我想使用clock_gettime() 函数来衡量我的代码的性能。
我无法从手册页描述中理解函数中使用的不同类型时钟之间的区别。特别是
CLOCK_REALTIME,
CLOCK_PROCESS_CPUTIME_ID
CLOCK_THREAD_CPUTIME_ID
谁能解释一下这些时钟的作用?
【问题讨论】:
您好,我想使用clock_gettime() 函数来衡量我的代码的性能。
我无法从手册页描述中理解函数中使用的不同类型时钟之间的区别。特别是
CLOCK_REALTIME,
CLOCK_PROCESS_CPUTIME_ID
CLOCK_THREAD_CPUTIME_ID
谁能解释一下这些时钟的作用?
【问题讨论】:
CLOCK_REALTIME 报告实际挂钟时间。
CLOCK_MONOTONIC 用于测量相对实时。它以与实际时间流相同的速率前进,但不受手动或自动 (NTP) 系统时钟调整的不连续性影响。
CLOCK_PROCESS_CPUTIME_ID 用于测量进程消耗的 CPU 时间量。
CLOCK_THREAD_CPUTIME_ID 用于测量线程消耗的 CPU 时间量。自 2.6.12 以来,现代内核和 glibc 都支持它,但在较旧的 linux 内核上,glibc 通过简单地返回自线程创建以来进程消耗的 CPU 时间量来模拟它。 p>
【讨论】:
CLOCK_MONOTONIC 如果你想测量总运行时间,包括阻塞等待 IO 的时间,应该使用CLOCK_MONOTONIC,但它也包括在你的程序试图运行时其他进程被调度导致的减速。 CLOCK_PROCESS_CPUTIME_ID 只会计算代表您的进程执行的实际时钟周期(我相信在用户空间或内核空间中),但不会计算阻塞/睡眠所花费的任何时间。
CLOCK_MONOTONIC 会因平滑的时钟调整(例如通过 ntpd)而快速或慢速运行,但它永远不会不连续。
CLOCK_MONOTONIC 像某些人所说的那样被破坏了,那么绝对不应该使用它,内核应该重新映射它以匹配CLOCK_MONOTONIC_RAW。这就是为什么我对声称它被破坏的说法持怀疑态度......