【问题标题】:C++ calculating time intervalsC++ 计算时间间隔
【发布时间】:2012-08-14 19:07:23
【问题描述】:

我想计算程序中发生的一些事件之间的时间间隔(以 1 秒的 1/10 为单位)。因此,我使用clock 函数来满足这些需求,如下所示:

    clock_t begin;
    clock_t now;
    clock_t diff;

    begin = clock();

    while ( 1 )
    {
        now = clock();
        diff = now - begin;
        cout << diff / CLOCKS_PER_SEC << "\n";
        //usleep ( 1000000 );
    };

我希望程序打印0 1 秒,然后1 1 秒,然后2 1 秒。等等...实际上它打印0 大约8 秒,然后1 大约8 秒等等...

顺便说一句,如果我添加 usleep 以使程序每秒只打印 1 次,那么它一直只打印 0...

非常感谢您的帮助!

【问题讨论】:

    标签: c++ unix time g++ clock


    【解决方案1】:

    也许您必须将其类型转换为 double。

    cout << (double)(diff / CLOCKS_PER_SEC) << "\n";
    

    整数被四舍五入,在你的情况下可能为 0。

    【讨论】:

    • -1 这真的不重要。在一秒钟内,diff 应该 > CLOCKS_PER_SEC 并且整数除法将导致 1。这就是 OP 所期望的。
    【解决方案2】:

    我敢打赌,您的打印对标准输出非常重要,以至于旧打印正在缓冲。缓冲区正在增长,控制台的输出跟不上您的紧密循环。通过添加睡眠,您可以让缓冲区有时间刷新和赶上。所以即使它进入你的程序 8 秒,你打印的东西是 8 秒前的。

    我建议将实际时间戳放入打印语句中。查看时间戳是否与实际时间明显滞后。

    【讨论】:

      【解决方案3】:

      clock() 函数返回为您的程序收取的 CPU 时间量。当您在usleep() 呼叫中被阻止时,不会向您收取任何时间,这很清楚为什么您的时间似乎永远不会增加。至于为什么您似乎要花 8 秒来收取一秒的费用——您的系统内还有其他事情正在发生,消耗您想要消耗的 CPU 时间,但您必须共享处理器。 clock()不能用来衡量实时的流逝。

      【讨论】:

      • 谢谢!也许您可以建议在我的 C++ 程序中测量实时的最简单方法?
      • time() 函数返回当前时间,表示为自 1970 年 1 月 1 日 UTC 以来的秒数。 gettimeofday() 让您以微秒分辨率获得时间;见linux.die.net/man/2/gettimeofdaystackoverflow.com/questions/1468596/… 有一个使用它的例子。
      • 非常感谢您的回复!我知道time,但我需要测量msecondsuseconds,所以我会阅读gettimeofday,谢谢您的建议!
      • @Kolyunya C++11 具有通用时钟,包括一个应该具有高分辨率的时钟 (std::chrono::high_resolution_clock)。这可能是gettimeofday 的符合标准的替代方案。
      【解决方案4】:

      了解time() 函数。

      【讨论】:

      • 最好先阅读其他回复,然后再阅读有关他们的 cmets,然后再回复帖子。
      【解决方案5】:

      如果您能够使用 boost,请查看 Boost Timers 库。

      【讨论】:

        猜你喜欢
        • 2014-02-18
        • 2015-06-15
        • 1970-01-01
        • 2016-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-11
        相关资源
        最近更新 更多