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

标签 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 分钟或更长时间。 这很常见吗?

最佳答案

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

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

  • 对于父进程,时间应该是正数。因为 start_timeend_time 的时钟滴答计数是针对同一个进程的。

  • 对于子进程,由于它只在fork()之后启动,clock()将返回时钟的编号勾选程序从这一点开始运行。 fork()之前的时间不记录。

    由于计算时钟滴答的起始引用不同:

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

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

编辑

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

关于c++ - 为什么使用 clock() 在测量 CPU 时间时得到负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808771/

相关文章:

c++ - 使用 DMA 在我的 nucleo-L432KC 上设置时钟以进行 5 channel adc 转换

c++ - 使用unique_lock锁定互斥锁时调用std::system_error

c++ - 包含 Map(具有对象值)和 Multimap(具有 std::string 值)的对象的 boost 序列化:需要什么?

Git不使用计算机时钟来提交

objective-c - 计算两个时间点之间的秒数,在 Cocoa 中,即使系统时钟在中途发生变化

java - 如果时钟更改/调整,我可以收到通知吗?

c++ - 如何知道同一台机器上的两个进程之间是否存在 TCP 连接?

c++ - 使用 std::string 作为 std::map 的键

c++ - Linux下使用distutils交叉编译python扩展

linux - 我的 Raspberry Pi :s clock is drifting, 如何让它尽可能准确?