【问题标题】:Understanding the different clocks of clock_gettime()了解clock_gettime()的不同时钟
【发布时间】:2011-09-21 21:34:40
【问题描述】:

您好,我想使用clock_gettime() 函数来衡量我的代码的性能。

我无法从手册页描述中理解函数中使用的不同类型时钟之间的区别。特别是

CLOCK_REALTIME,

CLOCK_PROCESS_CPUTIME_ID

CLOCK_THREAD_CPUTIME_ID

谁能解释一下这些时钟的作用?

【问题讨论】:

标签: c++ c clock


【解决方案1】:

CLOCK_REALTIME 报告实际挂钟时间。

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

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

CLOCK_THREAD_CPUTIME_ID 用于测量线程消耗的 CPU 时间量。自 2.6.12 以来,现代内核和 glibc 都支持它,但在较旧的 linux 内核上,glibc 通过简单地返回自线程创建以来进程消耗的 CPU 时间量来模拟它。 p>

http://man7.org/linux/man-pages/man2/clock_gettime.2.html

【讨论】:

  • 这取决于您要测量的内容。 CLOCK_MONOTONIC 如果你想测量总运行时间,包括阻塞等待 IO 的时间,应该使用CLOCK_MONOTONIC,但它也包括在你的程序试图运行时其他进程被调度导致的减速。 CLOCK_PROCESS_CPUTIME_ID 只会计算代表您的进程执行的实际时钟周期(我相信在用户空间或内核空间中),但不会计算阻塞/睡眠所花费的任何时间。
  • 请注意,CLOCK_MONOTONIC 会受到 Linux 中系统时间调整的不连续性影响。 CLOCK_MONOTONIC_RAW 被定义来解决这个问题。
  • @BDatRivenhill:我相信你错了。 CLOCK_MONOTONIC 会因平滑的时钟调整(例如通过 ntpd)而快速或慢速运行,但它永远不会不连续。
  • 我倾向于认为我们正确吗?请参阅 stackoverflow.com/questions/3657289/…>,它建议使用 CLOCK_MONOTONIC_RAW 进行游戏循环,因为 CLOCK_MONOTONIC 可能会向后跳。
  • 我认为这根本不是特定于游戏玩家的。如果CLOCK_MONOTONIC 像某些人所说的那样被破坏了,那么绝对不应该使用它,内核应该重新映射它以匹配CLOCK_MONOTONIC_RAW。这就是为什么我对声称它被破坏的说法持怀疑态度......
猜你喜欢
  • 2014-06-07
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多