【问题标题】:Is clock() reliable for a timer?clock() 对于计时器是否可靠?
【发布时间】:2013-06-11 16:16:26
【问题描述】:

我正在使用clock(),我想知道它是否会重置或最大化。我使用它的目的只是将它从以前的函数调用中提取出来并找出不同之处。

到目前为止,感谢您的帮助,但我并不能真正让 chrono 在 VS '12 中工作,但它很好,因为我认为它比我需要的多一点,我正在考虑使用 's time( ) 但我不知道如何将 t_time 转换为仅包含当前秒数 0-60 的 int,有什么帮助吗?

【问题讨论】:

  • 如果您对此感到担心,请查看 librt 的 clock_gettime(CLOCK_MONOTONIC, ...) 代替。假设您被允许使用 librt 库,这可能更符合您的要求。

标签: c++ clock ctime


【解决方案1】:

就标准而言,

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.

【讨论】:

    【解决方案2】:

    取决于您使用的系统。它可以使用 32+ 或 64 位 clock_t。它肯定会翻转,但如果它是 64 位的,它会在翻转之前的相当长一段时间内正常 - 264 微秒仍然是一个非常长的时间(大约 244 秒,每天大约有 216 秒,所以 228 天 - 大约是 220,或一百万, 年... ;)

    当然,在 32 位系统中,我们有大约 212=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";
    }
    

    【讨论】:

    • 谢谢,我在使用 chrono 时遇到了很多麻烦,但你认为你可以给我一个代码,它只返回自上次调用以来的秒数?
    • std::this_thread::sleep_for(std::chrono::seconds(10));sleep 的 C++11 等效项(某些编译器可能不支持)
    • @milleniumbug:谢谢。懒得去查了——我很少用chrono,所以我只用了一些我知道它是什么的东西。我想我可以改用char dummy; cin &gt;&gt; dummy;...
    • @MatsPetersson 好吧,在这个例子中这当然无关紧要——只是觉得我应该提一下。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2012-03-07
      • 2019-02-20
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多