为什么使用 clock() 在测量 CPU 时间时得到减号
why using clock() get minus number in measuring CPU time
我正在使用 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_time
和end_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 格式说明符(并且您可能会收到并忽略来自编译器的警告),因此您会看到垃圾。
- 分别测量每个线程上花费的 CPU 时间(C++)
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 一段时间后 CPU 使用率高
- C/C++memcpu基准测试:测量CPU和墙时间
- 超过CPU时间限制:当MPI_Sent一个非常大的int*时
- 如何测量一组特定线程的 CPU 时间?
- OpenCV 3.4 C++ Cuda 加速比 CPU 花费更多时间
- 如何以C++而不是 CPU 时间测量挂钟时间
- 将返回 CPU 时间提升为 0
- C++中的双感叹号(!!)会花费更多的CPU时间吗
- 为什么内存访问时间远远超过CPU缓存大小时会增加
- 在我的CUDA运行时间计划中,CPU和GPU可以异步计算,但不能合作地计算
- 即使使用睡眠,线程也不会放弃CPU时间
- 以C++为单位测量程序的 CPU 时间和挂钟时间
- 在 Windows 上以C++计算 CPU 时间
- 一段时间后,C++应用程序占用100%的cpu周期
- 时间短函数与 CPU 时间使用 RTEMS 操作系统
- PDH 无法通过 PdhAddCounter() 访问总 CPU 时间
- 二叉搜索真的是在 0 时钟 CPU 时间内执行的吗?
- 我应该检查什么:cpu时间还是墙时间