【问题标题】:clock() and CLOCKS_PER_SEC on OSX 10.7OSX 10.7 上的 clock() 和 CLOCKS_PER_SEC
【发布时间】:2013-05-17 19:32:13
【问题描述】:

我在 OSX 中使用 clock() 时遇到问题。 我只想显示自程序启动以来经过的时间。 问题是,当我将 clock_t 结构除以 CLOCKS_PER_SEC 时,我得到了奇怪的结果。

运行我的程序 10 秒将显示 1.0。 CLOCKS_PER_SEC 在我的系统上设置为 1,000,000。

这是我的代码示例:

    //startTime = clock() at the start of the program
    //This is called in each program loop       
    elapsedTime = (double)(clock() - startTime)/CLOCKS_PER_SEC

如果我正在做 elapsedTime * 10,我会以秒为单位得到准确的值。 在程序执行期间,我根本不做任何睡眠或等待。

非常感谢任何帮助了解正在发生的事情。

编辑:

好的,我更正了演员表,但这并没有改变如果我运行程序 10 秒我得到 1.0, 1 seconds is 0.1 的事实。这是我不明白的。我的 CLOCKS_PER_SEC 就像 CLOCKS_PER_TEN_SEC。

【问题讨论】:

  • 在两次clock() 通话之间你在做什么?
  • 只是用 SFML 画一个简单的图像。 (不涉及 fps 限制)。我还在每一帧上显示 elaspedTime,我看到每一秒增加了大约 0.1 到 elapsedTime。
  • 那么可能大部分处理都是由 GPU 完成的,没有被clock() 计算在内。
  • 没想到。但我不知道如何验证它。我刚刚发现 SFML 有一个 Clock 类,我想我会坚持下去,但仍然不明白为什么我通过将 elapsedTime 乘以 10 得到相当准确的结果。

标签: c++ macos clock time.h


【解决方案1】:

我认为你的演员在错误的地方,所以你得到一个整数除法。试试这个:

elapsedTime = (double)(clock() - startTime)/CLOCKS_PER_SEC;

编辑:

另请注意,在大多数系统上,clock() 测量 CPU 时间。也许您使用的 CPU 时间没有您想象的那么多。

【讨论】:

    【解决方案2】:

    将你的演员表移到第一个括号内:

     elapsedTime = ((double)(clock() - startTime)/CLOCKS_PER_SEC)
    

    现在clock() -startTime 变为双精度,强制 CLOCKS_PER_SEC 也为浮点值,你得到浮点结果。否则,它是一个整数除法,你只能得到整数结果。

    【讨论】:

      【解决方案3】:

      clock() 与 CLOCKS_PER_SEC 不适合在 Mac OS X 上使用。clock() 以滴答为单位返回处理器时间,而 POSIX 规定 CLOCKS_PER_SEC 为 1000000,如手册页所述。

      在我遇到这种情况时,和你一样,计算结果相差十倍。因此,clock() 以每秒 100000 个时钟的速度运行。在 Windows 上,我看到每秒 1000 个时钟。但是,如果您对此进行检查,实际分辨率和精度可能会比这差得多,因此 clock() 通常不是一个好的解决方案。对于 Mac OS X,gettimeofday 是一个更好的解决方案。我还认为 std::chrono 是一个很好的解决方案,应该是一个更好的跨平台选择,但我还没有尝试过。

      【讨论】:

      • 如果您决定尝试chrono,这里有一个视频教程可以帮助您入门:youtube.com/watch?v=P32hvk8b13M :-) 但是,chrono 只会测量经过的时间,而不是像 @987654324 这样的处理器时间@ 会。
      • 是的,就我而言,我只对经过的时间感兴趣,大约是毫秒精度。你是对的,我没有注意到虽然Windows下的clock()被定义为“挂钟时间”,但unix版本是处理器时间。 (我从一开始就在 Mac 端使用 gettimeofday,但在 Windows 版本中使用了 clock() ——我只是在试验是否可以使用 clock() 并避免轻微的条件编译丑陋。)底线是时钟() 在 Windows 上非常粗糙,在 Mac 上是错误的。显然,chrono 是最好的跨平台选择。
      • FWIW,单行表示当前时间,以毫秒为单位 (#include ):std::chrono::duration_cast<:chrono::milliseconds>(std::chrono: :steady_clock::now().time_since_epoch()).count();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      相关资源
      最近更新 更多