<time.h> clock()无法正常工作</time.h>

时间:2014-12-08 15:11:11

标签: c++ linux time

我试图估计代码块的持续时间(特别是为了获得基于物理的动画的帧速率独立性的时间步长,所以分辨率应该是毫秒等级)。堆栈溢出的问题主要是推荐使用clock()方法,我已经尝试了但是它似乎没有正常工作。我已经使用gettimeoftheday()方法解决了这个问题,但我仍然很好奇为什么clock()失败了。这是我的代码块:

for (int i = 0; i < 10000; i++)
{
    std::cout << "time: " << clock() << std::endl;
    usleep(1000);
}

以一定的速度打印时间。当我将usleep值增加到1000000时,打印时钟值的增加率急剧下降。我认为clock()应该给出一个与绝对时间值相关的值,与我的代码无关。

提前致谢。

PS:为了提前避免误解,我并没有抱怨打印率下降了。在某个增量时间打印的VALUE在usleep(1000)和usleep(1000000)之间不一样。

2 个答案:

答案 0 :(得分:1)

  

我认为clock()应该给出一个与绝对时间值相关的值

你错了。从其规范(C99 7.32.2.1)

  

clock函数确定使用的处理器时间

如果您想要绝对时间,请使用timestd::chrono库中的合适时钟,或clock_gettimegettimeofday等不太便携的时钟。

答案 1 :(得分:0)

问题假设是错误的,但由于时间测量和时间API令人困惑,我不得不提出问题,因此用户提出这样的问题是正确的。

  • 有“实时时钟”,它试图追踪“日历时间”中的时间,即人们使用的时间。这些可以前进1小时,后退1小时,前进1秒等。这些不能用于测量计算的长度。所以time(),gettimeofday()和clock_gettime(CLOCK_REALTIME)都没了。
  • 有“单调时钟”,试图以与其他人协调的方式跟踪实时通过。这些时钟永远不会回溯,与“实时时钟”不同,它们是可用于测量性能的时钟。然而,它们仍然可以在运行中进行调整,例如减速或加速1秒以与其他人同步。它们非常便携,例如,使用clock_gettime(CLOCK_MONOTONIC)。
  • 有“原始时钟”,试图跟踪实时传递而不与其他人协调。 Linux有clock_gettime(CLOCK_MONOTONIC_RAW),它只使用硬件时钟来计数。只要您想要包括睡眠或等待I / O的时间,那么测量在过程上花费的时间真的很好。从中长期来看,由于硬件时钟漂移和振荡,它们不能用于与其他人协调时间。
  • 有“cpu clocks”,它试图跟踪cpu使用时间。它们可能包括用户代码时间,内核时间,但不包括进程正在休眠的时间。 clock_gettime(CLOCK_PROCESS_CPUTIME_ID),times()和clock()返回这些。
  • 最后,有“定时器”,它使用上述时钟来实现具有或多或少精确间隔的可重复定时信号。那些是像timer_create(),timerfd_create()和setitimer()。

鉴于问题描述,我将使用最后一个进行计算:设置1秒间隔计时器,在完成时触发信号。然后打印您能够绘制的帧数。您可以稍后使用此数字调整帧渲染复杂度。