C++的clock()函数返回错误的值

3

我试图编写一个计时器类(不知道boost有一个),但当它无法工作时,我尝试输出clock()的值,使用以下代码:

#include <ctime>
#include <iostream>

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

当我运行程序时,我得到一系列的0。当我使用boost线程睡眠函数来稍微延长时间(尽管几秒钟后,它会从0跳到10000并继续输出10000),我有类似的经验。我正在运行Gentoo Linux。这是平台问题吗?C++问题?发生了什么?
编辑:奇怪的是,跳到10000需要多个,而不是毫秒。当我每次让线程睡眠一秒钟时,需要五六秒才能到达10000。然而,如果我理解正确的话,线程睡眠的时间不会对clock()计数产生贡献?(这是有道理的;为什么它在睡眠时要执行时钟周期呢?)

1
没错。当你的线程休眠时,系统不会将其调度到CPU上,clock()计数也会停止。在你的例子中,只有在唤醒和再次休眠之间的短时间段才会被计算。 - slacker
请注意,clock()返回整个程序的CPU时间,汇总所有线程。请参阅http://stackoverflow.com/a/5035854/13422。 - Zan Lynx
4个回答

7

clock() 函数的返回值单位是微秒,但是它所使用的底层系统调用的典型粒度要低得多。因此,在你的系统中,粒度为10毫秒。另外,需要注意的是,clock() 不是测量实际时间的函数,而是测量程序使用的 CPU 时间。因此,当你的程序控制 CPU 时,时间流逝,当你的程序被挂起——比如休眠时——时间会暂停。


3
注意--它不一定是微秒。这就是为什么有CLOCKS_PER_SEC宏的原因。 - Billy ONeal
2
这里说并不保证返回的时间单位是特定的。你需要使用CLOCKS_PER_SEC宏来将其转换为真实单位的时间。至于10毫秒的分辨率,我认为这并不是非常罕见的。 - Merlyn Morgan-Graham
然而,在符合POSIX标准的系统中,它必须是微秒(CLOCKS_PER_SEC被规定为1000000)。 - Tyler McHenry
1
我们中的一些人编写ISO代码,一些人编写POSIX代码。我不确定Linux是否完全符合POSIX标准。至少在早期,Linus对标准合规性的态度可以说是“不稳定”的(现在我不清楚)。不过这并不是什么坏事,在现实世界中,大多数时候实用主义胜过教条主义 :-) - paxdiablo
@slacker clock()不是“Unixish API”,它是C++标准的一部分。然而,我想补充说,我相对较早地需要开始为Win编写代码,我很惊讶在与GNU/Linux相比,在那里使用C++编程是多么困难。我猜现在我知道为什么有些人认为C#是一种好语言了。 - Hi-Angel
显示剩余5条评论

0
在我的64位操作系统上,CLOCKS_PER_SEC的速度为1000,clock的值以毫秒为单位。完美的时间将从下面的代码中提取。
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*/




}

0

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


0

请尝试以下代码:

#include <ctime>
#include <iostream>
int main() { for(int i = 0; i < 50; ++i) { for (int j = 0; j < 500; ++j ) { std::cout << j << " "; } std::cout << std::endl; std::cout << std::clock() << std::endl; } std::cout << std::endl; return 0; }

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接