作为计时器,clock()是可靠的吗?

Is clock() reliable for a timer?

本文关键字:计时器 clock      更新时间:2023-10-16

我正在使用clock(),我想知道它是否会重置或达到最大值。所有我使用它只是太主题,从以前的函数调用,并找到差异。

感谢到目前为止的帮助,但我不是真的能够得到chrono的东西在VS '12工作,但它很好,因为我认为它比我需要的多一点,我在考虑使用's time(),但我不知道如何将t_time转换成一个int,只包含当前秒0-60,任何帮助?

就标准而言,

clock_ttime_t中可表示的时间范围和精度由实现定义。

(C99,§7.23.1¶4)

所以不能保证范围;clock()的定义没有提到任何关于环绕的内容,尽管它说

如果使用的处理器时间不可用或其值不能表示,则函数返回值(clock_t)(-1)

所以我们可以说,超过clock_t的范围可以看作是"它的值不能被表示";另一方面,这种解释意味着,一段时间后,clock()将变得完全无用。

事实上,如果我们深入到一个特定的实现(glibc),我们会看到:

matteo@teokubuntu:~$ man 3 clock
   Note that  the  time  can  wrap  around.   On  a  32-bit  system  where
   CLOCKS_PER_SEC  equals 1000000 this function will return the same value
   approximately every 72 minutes.

这取决于您使用的是什么系统。它可以使用32+或64位clock_t。它肯定会翻滚,但如果它是64位的,在它翻滚之前它会好一段时间- 264微秒仍然是一段很长的时间(大约244秒,每天大约有216秒,所以228天-这大约是220,或者一百万年……;)

当然,在32位系统中,我们在微秒分辨率下大约有212=4096秒。一小时3600秒=约1h10m。

然而,在某些系统中,另一个问题是clock()返回CPU使用时间,因此如果您睡眠,它将不计入clock()中的时间。

当然,即使CLOCKS_PER_SEC可能是1000000,这并不意味着你得到了微秒的结果——在许多系统中,它一次"跳跃"10000个单位。

总之,"可能是个坏主意"。

如果你的系统上有c++ 11,请使用std::chrono,它有几个计时选项,对于大多数用途来说已经足够好了(但要研究std::chrono文档)

示例代码:

#include <iostream>
#include <chrono>
#include <unistd.h>  // replace with "windows.h" if needed.
int main()
{
    std::chrono::time_point<std::chrono::system_clock> start, end;
    start = std::chrono::system_clock::now();
// 10 seconds on a unix system. Sleep(10000) on windows will be the same thing
    sleep(10);   
    end = std::chrono::system_clock::now();
    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
                             (end-start).count();
    std::cout << "elapsed time: " << elapsed_seconds << "sn";
}

简单的答案是,如果您只是使用它来计时一个函数,它可能不会绕行。它也可能太慢,您可能会看到函数持续时间为零。如果你想要一个快速执行的函数的精确计时,你可能最好使用像Windows上这样的操作系统级别的调用。