为什么使用clock()在测量CPU时间时得到负数

时间:2012-05-30 01:09:08

标签: c++ clock

我使用clock()来测量算法的CPU时间。

代码如下:

start_time = clock();
//code to be timed
.
end_time = clock();
elapsed_time = (end_time - start_time)*1000 / CLOCKS_PER_SEC;

printf("Time taken %d seconds %d milliseconds\n", elapsed_time/1000, elapsed_time%1000 );

但结果是“0秒-175毫秒”。我不明白为什么。 似乎“1秒349毫秒”在过去的时间里真的需要10分钟或更长时间。 那是常见的吗?

2 个答案:

答案 0 :(得分:1)

分叉是一种特殊情况,这种类型的代码会导致负时间。其中一个原因是,clock()将返回自程序启动以来的时钟周期数。

提醒一下,start_time中的值将被复制到子进程。

  • 对于父进程,时间应该是正数。由于start_timeend_time的时钟滴答计数属于同一过程。

  • 对于子进程,由于它只在 fork()之后开始,clock()将返回程序从此时开始运行的时钟滴答数。未记录fork()之前的时间。

    由于计数时钟标记的起始参考不同:

    • start_time是自流程开始至第一个clock()
    • 的时钟滴答数
    • end_time是自过程开始直到第二个clock()开始的时钟滴答数)

    可能会导致负面结果。如果子进程运行的时间足以超过父进程启动的时间,则也可能产生肯定结果。

修改

我不确定预期的时间是多少,但是如果你想计算:从开始到结束的父进程的时钟滴答,以及从fork()到结束的子进程的时钟滴答,然后修改你的代码在子进程中使用新值start_time覆盖clock()。或者您可以将start_time设置为0。

答案 1 :(得分:0)

如果start_time和end_time是32位整数,它们只能保持大约2147秒(大约35分钟)才能翻转成负数,因为CLOCKS_PER_SEC是1000000。

但它比这更糟糕,因为你将差值乘以1000,这意味着如果它超过2.147秒就会溢出。

另一方面,如果它们不是32位整数,那么你使用错误的printf格式说明符(你可能会得到并忽略编译器发出的警告),所以你看到了垃圾。