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

why using clock() get minus number in measuring CPU time

本文关键字:时间 CPU 测量 clock 为什么      更新时间:2023-10-16

我正在使用 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 millisecondsn", elapsed_time/1000, elapsed_time%1000 );

但是结果我得到了"0秒-175毫秒"。我不明白为什么。似乎"1 秒 349 毫秒"真的需要 10 分钟或更长时间。这常见吗?

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

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

  • 对于父进程,时间应为正数。由于start_timeend_time的时钟周期计数是针对同一过程的。

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

    由于计算时钟周期的起始参考不同:

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

    它可能会导致阴性结果。如果子进程运行的时间足以超过父进程启动的时间,则也可能产生正结果。

编辑

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

如果 start_time 和 end_time 是 32 位整数,则它们在滚动为负数之前只能保持大约 2147 秒(约 35 分钟),因为CLOCKS_PER_SEC是 1000000。

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

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