1

我正在使用 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 分钟或更长时间。这很常见吗?

4

2 回答 2

1

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

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

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

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

    由于计数时钟滴答的起始参考不同:

    • start_time是从进程开始到第一个进程的时钟滴答数clock()
    • end_time是从进程开始到第二个的时钟滴答数clock()

    它可能会导致负面结果。如果子进程运行的时间足够长以超过父进程启动的时间量,则也可能产生积极的结果。

编辑

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

于 2012-05-30T01:34:50.307 回答
0

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

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

另一方面,如果它们不是 32 位整数,则说明您使用了错误的 printf 格式说明符(并且您可能会收到并忽略来自编译器的警告),因此您会看到垃圾。

于 2012-05-30T01:25:50.773 回答