首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><time.h> clock()不能正常工作

<time.h> clock()不能正常工作
EN

Stack Overflow用户
提问于 2014-12-08 15:11:11
回答 2查看 1.1K关注 0票数 0

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

代码语言:javascript
复制
for (int i = 0; i < 10000; i++)
{
    std::cout << "time: " << clock() << std::endl;
    usleep(1000);
}

它以一种速度打印时间。当我把睡眠值增加到,比如说1000000,打印时钟值的增长率就会急剧下降。我认为clock()应该提供一个与绝对时间值相关的值,而不依赖于我的代码。

提前谢谢。

PS:为了事先消除可能的误解,我不是在抱怨印刷比率下降了。在特定的增量时间打印的值在usleep(1,000)和usleep(1000000)之间并不相同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-08 15:53:27

问题假设是错误的,但我不得不提出这个问题,因为时间测量和时间API是混淆的,所以用户问这样的问题是正确的。

  • 有“实时时钟”,它试图跟踪“日历时间”中的时间,即人们使用的时间。这些可以向前走1小时,向后走1小时,向前1秒,等等。这些绝不能用来测量计算的长度。于是time()、gettimeofday()和clock_gettime(CLOCK_REALTIME)就退出了。
  • 有“单调时钟”,它试图跟踪实时传递,以协调的方式与其他人。这些时钟永远不会回到过去,而且与“实时时钟”不同的是,它们是用来测量性能的可用时钟。但是,它们仍然可以在飞行中进行调整,比如减速或加速1秒,以便与其他人同步。例如,通过使用clock_gettime(CLOCK_MONOTONIC),它们是非常可移植的。
  • 有“原始时钟”,它试图跟踪实时传递,而不与其他人协调。Linux有clock_gettime(CLOCK_MONOTONIC_RAW),它只是使用硬件时钟来计数。只要你想把睡眠或等待I/O的时间包括在中长期,它们就不能被用来和其他人协调时间,因为硬件时钟的漂移和振荡。
  • 有"cpu时钟“,它试图跟踪cpu使用时间。它们可能包括用户代码时间、内核时间,但不包括进程休眠的时间。clock_gettime(CLOCK_PROCESS_CPUTIME_ID)、times()和clock()返回这些内容。
  • 最后,还有“计时器”,它使用上述时钟来实现或多或少精确间隔的可重复定时信号。这些都是像timer_create()、timerfd_create()和setitimer()这样的东西。

给定问题描述,我将使用最后一个计算:设置一个1秒间隔计时器,当完成时触发一个信号。然后打印您能够绘制的帧数。稍后您可以使用这个数字调整框架呈现的复杂性。

票数 0
EN

Stack Overflow用户

发布于 2014-12-08 15:14:42

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

你想错了。(C99 7.32.2.1)

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

如果您想要绝对时间,可以使用time,或者使用std::chrono库中合适的时钟,或者不太容易移植的东西,比如clock_gettimegettimeofday

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27360952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档