3

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

#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。但是,如果我理解正确的话。线程睡眠的时间对时钟()计数没有贡献吗?(这是有道理的;如果它在睡觉,为什么要执行时钟周期?)

4

4 回答 4

7

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

于 2010-08-30T02:11:06.460 回答
0

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

于 2010-08-30T02:11:30.310 回答
0

尝试以下操作:

#include <ctime>
#include <iostream>

主函数()
{
   for(int i = 0; i < 50; ++i)
   {
      对于 (int j = 0; j < 500; ++j)
      {
         std::cout << j << " ";
      }
      std::cout << std::endl;
      std::cout << std::clock() << std::endl;
   }
   std::cout << std::endl;
   返回0;
}     

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

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

于 2010-08-30T03:07:55.803 回答
0

在我的 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*/




}
于 2015-01-24T21:25:10.673 回答