理解clock_gettime()的不同时钟

smi*_*dha 31 c c++ clock

嗨,我想使用该clock_gettime()函数来测量我的代码的性能.

我无法理解手册页描述中函数中使用的各种时钟之间的区别.ESP

CLOCK_REALTIME,

CLOCK_PROCESS_CPUTIME_ID

CLOCK_THREAD_CPUTIME_ID
Run Code Online (Sandbox Code Playgroud)

有人可以解释每个钟表的作用吗?

R..*_*R.. 37

CLOCK_REALTIME 报告实际的挂钟时间.

CLOCK_MONOTONIC用于测量相对实时.它以与实际时间流相同的速率前进,但不会受到系统时钟的手动或自动(NTP)调整的不连续性影响.

CLOCK_PROCESS_CPUTIME_ID 用于测量进程消耗的CPU时间量.

CLOCK_THREAD_CPUTIME_ID用于测量线程消耗的CPU时间量,但Linux不支持它.glibc通过简单地返回自创建线程之后的进程消耗的CPU时间量来模拟它.

更新:似乎现代内核和glibc现在支持CLOCK_REALTIME正确.我没有详细介绍它何时修复.

  • 这取决于你想要衡量的东西.如果要测量总耗用时间(包括等待IO等待的时间),则应使用`CLOCK_MONOTONIC`,但它还包括在程序尝试运行时由其他进程调度导致的速度减慢.`CLOCK_PROCESS_CPUTIME_ID`将仅计算代表进程执行的实际时钟周期(我相信在用户空间或内核空间中),但不会计算阻塞/休眠所花费的任何时间. (7认同)
  • @BDatRivenhill:我相信你错了.由于平滑的时钟调整(例如,通过ntpd),"CLOCK_MONOTONIC"可能会快速或慢速运行,但它永远不会是不连续的. (2认同)
  • 我倾向于认为BDat我们是正确的吗?参见<http://stackoverflow.com/questions/3657289/linux-clock-gettimeclock-monotonic-strange-non-monotonic-behavior>其中建议使用CLOCK_MONOTONIC_RAW游戏循环由于CLOCK_MONOTONIC向后跳跃possibilty的. (2认同)
  • 我认为这根本不是特定于玩家的。如果“CLOCK_MONOTONIC”像某些人所说的那样被破坏,那么绝对不应该使用它,内核应该重新映射它以匹配“CLOCK_MONOTONIC_RAW”。这就是为什么我对它已经损坏的说法持怀疑态度...... (2认同)