clock()对于计时器是否可靠?

时间:2013-06-14 22:33:55

标签: c++ clock ctime

我正在使用clock(),我想知道它是否会重置或最大化。我正在使用它的所有内容都是从以前的函数调用中获取它并找到差异。

到目前为止感谢你的帮助,但是我真的无法让这个计时器在VS '12中工作,但它很好,因为我认为它比我需要的多一点,我想到了使用时间( )但我不知道如何将t_time转换为只包含当前秒0-60的int,有什么帮助?

3 个答案:

答案 0 :(得分:3)

就标准而言,

  

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.

答案 1 :(得分:1)

取决于您所使用的系统。它可能使用32+或64位clock_t。它肯定会翻身,但是如果它是64位的话,它会在它滚动之前很长一段时间就可以了 - 2 64 微秒仍然是一个非常长的时间(约2 44 < / sup>秒,每天大约2 16 秒,所以2 28 天 - 大约2 20 ,或者一百万,年......;)

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

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

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

总之,“可能是一个坏主意”。

如果您在系统上安装了C ++ 11,请使用std::chrono,它有几个适合大多数目的的计时选项(但是要研究std::chrono docs

示例代码:

#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 << "s\n";
}

答案 2 :(得分:0)

简单的答案是,如果你只是用它来计算一个函数的时间,它可能不会回转。它也可能太慢,你可能会看到函数持续时间为零。如果您想要快速执行的函数的精确计时,您可能更好地使用像this one on Windows这样的OS级别调用。