【问题标题】:C++ Keeping track of how many seconds has passed since start of programC++ 跟踪程序启动后经过的秒数
【发布时间】:2010-12-16 15:47:54
【问题描述】:

我正在编写一个将在 Solaris 机器上使用的程序。我需要一种方法来跟踪自程序启动以来已经过去了多少秒。我在这里说的很简单。例如我会有一个 int seconds = 0;但是我将如何在每一秒过去时更新 seconds 变量?

我看过的一些不同的时间函数似乎只能在 Windows 机器上运行,所以我不确定。

任何建议将不胜感激。

感谢您的宝贵时间。

【问题讨论】:

  • 你需要每秒一个事件吗?更新什么?或者只是程序运行的总秒数?

标签: c++ time


【解决方案1】:

您只需要存储应用程序启动的日期/时间。每当您需要显示程序运行了多长时间时,请获取当前日期/时间并减去应用程序启动的时间。

【讨论】:

    【解决方案2】:

    一个很简单的方法:

    #include <time.h>
    time_t start = time(0);
    
    double seconds_since_start = difftime( time(0), start);
    

    这样做的主要缺点是您必须轮询更新。您需要平台支持或其他一些库/框架才能根据事件执行此操作。

    【讨论】:

    • time() 返回挂钟时间,clock() 返回处理器时间。
    • clock() 也可能有用...由于 OP 只对经过的时间感兴趣,因此可能不需要挂墙时间。此外,对于长时间运行的程序,time() 可能会受到 NTP 漂移、DST、用户更改等因素的影响......这可能会影响结果。
    • @AraK 你为什么要删除你的答案?
    • @jheddings 老实说,我不太确定答案,Michael 解释了其中的区别。所以,也许我必须更好地研究图书馆,所以我给出了更好的答案。对不起,题外话了。
    • 毫无疑问,在处理时间时可能有很多微妙之处,这取决于您想要的时间、您想要的准确度、是否需要日历形式等。但是由于 OP“在这里说得很简单”,我认为没有必要用所有的冗长来使答案复杂化。有时人们只想要一个秒计数器。
    【解决方案3】:

    您正在向后接近它。您不必担心每秒更新一次变量,只需在程序开始时用当前时间初始化一个变量,然后每当您需要知道已经过去了多少秒时,您就可以从该初始时间中减去现在的当前时间。这样开销要少得多,并且不需要护理一些与时间相关的变量更新。

    【讨论】:

    • “护理”一个变量——现在这是一个概念!出于性能考虑,我经常忽略这一点。这里的总 AHA 时刻......
    【解决方案4】:
    #include <stdio.h>
    #include <time.h>
    #include <windows.h>
    using namespace std;
    void wait ( int seconds );
    int main ()
    {
      time_t start, end;
      double diff;
      time (&start); //useful call
      for (int i=0;i<10;i++) //this loop is useless, just to pass some time.
      {
      printf ("%s\n", ctime(&start));
      wait(1);
      }
      time (&end);//useful call
    
      diff = difftime(end,start);//this will give you time spent between those two calls.
      printf("difference in seconds=%f",diff); //convert secs as u like
      system("pause");
      return 0;
    }
    void wait ( int seconds )
    {
      clock_t endwait;
      endwait = clock () + seconds * CLOCKS_PER_SEC ;
      while (clock() < endwait) {}
    }
    

    这在 solaris/unix 上也应该可以正常工作,只需删除 win refs

    【讨论】:

      【解决方案5】:

      使用std::chrono

      #include <chrono>
      #include <iostream>
      
      int main(int argc, char *argv[])
      {
         auto start_time = std::chrono::high_resolution_clock::now();
         auto current_time = std::chrono::high_resolution_clock::now();
      
         std::cout << "Program has been running for " << std::chrono::duration_cast<std::chrono::seconds>(current_time - start_time).count() << " seconds" << std::endl;
      
         return 0;
      }
      

      如果你只需要几秒的分辨率,那么std::steady_clock 就足够了。

      【讨论】:

      • std::chrono 在 c++11 中是新的,所以你的编译器可能不支持它。
      • 我为您对 C++11 方法的回答 +1 了,但不幸的是,它无法在启用 C++11 的 GCC 4.8.4 上编译。但有效的是在输出中使用duration_caststd::chrono::duration_cast&lt;std::chrono::duration&lt;float&gt;&gt;(current_time - start_time).count()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      相关资源
      最近更新 更多