【问题标题】:C++ clock() function giving incorrect valuesC ++时钟()函数给出不正确的值
【发布时间】:2010-08-30 02:00:53
【问题描述】:

我试图编写一个 Timer 类(不知道 boost 有一个),然后当它不起作用时,我尝试使用以下代码仅输出 clock() 的值:

#include <ctime>
#include <iostream>

int main()
{
 for(int i = 0; i < 50; ++i)
 {
  std::cout << std::clock() << " ";
 }
 return 0;
}

当我运行程序时,我得到一系列 0。在使用 boost thread sleep 函数将时间延长一点时,我也有类似的经历(尽管几秒钟后,它会从 0 跳到 10,000 并保持输出 10,000)。

我正在运行 Gentoo Linux。这是平台的事情吗?一个 C++ 的东西?怎么回事?

编辑:奇怪的是,跳转到 10000 是在 之后,而不是毫秒。当我一次睡一秒钟时,需要五六秒钟才能达到 10000。但是,如果我理解正确的话。线程睡眠的时间对时钟()计数没有贡献吗? (这是有道理的;如果它正在休眠,为什么要执行时钟周期?)

【问题讨论】:

  • 没错。当您的线程休眠时,系统不会将其调度到 CPU 并且 clock() 计数被冻结。在您的示例中,只有在醒来和再次入睡之间的短暂时间跨度才重要。
  • 请注意,clock() 返回整个程序的 CPU 时间,对所有线程求和。见stackoverflow.com/a/5035854/13422

标签: c++ clock


【解决方案1】:

clock() 返回值以微秒为单位指定。但是,clock() 实现使用的任何低级系统调用的典型粒度要低得多。因此,在您的系统上,粒度似乎是 10 毫秒。另请注意,clock() 确实 NOT 测量实时 - 它测量程序使用的 CPU 时间。因此,当您的程序控制 CPU 时,时间会流动,而当您的程序挂起(例如,睡眠)时,时间会冻结。

【讨论】:

  • 注意——它没有是微秒。 (因此是 CLOCKS_PER_SEC 宏的原因)
  • cplusplus.com/reference/clibrary/ctime/clock。这表示它不能保证是任何特定的单位。您必须使用 CLOCKS_PER_SEC 宏来以实际单位查找时间。至于 10 毫秒的分辨率,我认为这并不少见。
  • 但是,在符合 POSIX 的系统中,它确实必须是微秒(CLOCKS_PER_SEC 强制要求为 1000000)。
  • POSIX 要求 CLOCKS_PER_SEC == 1000000。因此,除非您使用的是旧的古怪操作系统,否则它将是微秒 :)。
  • 我们中的一些人为 ISO 编写代码,一些人为 POSIX 编写代码。我不确定 Linux 是否完全符合 POSIX。 Linus 对标准合规性的态度,容我们说,“参差不齐”,至少在早期(现在不知道)。并不是说那是一件坏事,大多数时候实用主义在现实世界中胜过教条主义:-)
【解决方案2】:

std::clock 的分辨率未指定。在大多数情况下,它的分辨率约为10ms。因此跳跃。

【讨论】:

    【解决方案3】:

    尝试以下方法:

    #include #include 主函数() { for(int i = 0; i

    在我的系统上,我看到 clock() 的返回值一直保持为 0,直到某个时候它跳到 10000。它一直保持在 10000 直到结束。如果我在内部循环中删除 std::cout ,则 clock() 的返回值一直保持在 0 。看起来 clock() 仅以 10000 为增量返回值。

    如果我改变内部循环来计算 j 的平方根并打印 sqrt() 的返回值,clock() 的返回值会上升到 50000,但仍以 10000 的增量增加。

    【讨论】:

      【解决方案4】:

      在我的 64 位操作系统上,CLOCKS_PER_SEC 速度为 1000。时钟的值以毫秒为单位。完美的时机将从下面的代码中提取出来。

      int main(){
      
      clock_t a,b;
      int c,d,e,f;
      c=clock();
      scanf("%d",&e);
      d=clock();
      f=(d-c)/CLOCKS_PER_SECOND;
      printf("timing is %d seconds",f);/*for 64 bit operating system         
      CLOCKS_PER_SECOND is 1000*/
      
      
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 2022-07-20
        • 1970-01-01
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        • 2018-09-18
        • 2022-01-19
        相关资源
        最近更新 更多