我使用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分钟或更长时间。 那是常见的吗?
答案 0 :(得分:1)
分叉是一种特殊情况,这种类型的代码会导致负时间。其中一个原因是,clock()
将返回自程序启动以来的时钟周期数。
提醒一下,start_time
中的值将被复制到子进程。
对于父进程,时间应该是正数。由于start_time
和end_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格式说明符(你可能会得到并忽略编译器发出的警告),所以你看到了垃圾。