【问题标题】:measure time difference测量时差
【发布时间】:2010-12-15 00:01:21
【问题描述】:

我想以毫秒为单位测量从我启动应用程序到另一个时间(例如 16:00 点)之间的时间。最好的方法是什么?

我查看了“时钟”功能,但这不是我需要的。

操作系统:Win NT及以上

【问题讨论】:

    标签: c++ time localtime


    【解决方案1】:

    在 POSIX 系统上查找 gettimeofday,在 Windows 上查找 timeGetTime

    编辑:似乎 OP 要求代码将当前时间/日期与另一个时间/日期进行比较。下面的 sn-p 演示了如何在 Windows 上获取当前日期和时间:

     #include <Windows.h>
     #include <stdio.h>
    
     void main()
     {
         SYSTEMTIME st;
         GetSystemTime(&st);
         printf("Year:%d\nMonth:%d\nDate:%d\nHour:%d\nMin:%d\nSecond:%d\n"
           ,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
     }
    

    以下是计算两个 SYSTEMTIME 对象之间差异的方法:

     #include <windows.h>
     #include <iostream>
    
     // Return time difference in units of 100 us.
     _int64 Delta(const SYSTEMTIME st1, const SYSTEMTIME st2) {
      union timeunion {
          FILETIME fileTime;
          ULARGE_INTEGER ul;
      } ;
    
      timeunion ft1;
      timeunion ft2;
    
      SystemTimeToFileTime(&st1, &ft1.fileTime);
      SystemTimeToFileTime(&st2, &ft2.fileTime);
    
      return ft2.ul.QuadPart - ft1.ul.QuadPart;
    }
    
    int main() {
      SYSTEMTIME t1 = {0}, t2 = {0};
      t1.wDay = 10;
      t1.wMonth = 4;
      t1.wYear = 2009;
    
      t2.wDay = 12;
      t2.wMonth = 4;
      t2.wYear = 2009;
    
      _int64 i = Delta(t1, t2);
      std::cout << "times are " << i / 10000000 << " seconds apart\n";
    
      return 0;
    }
    

    这两个示例应该为您提供执行所需的工具。

    【讨论】:

    • 感谢 Julio 这正是我想要的!
    • @Julio 恕我直言。这是我从许多解决方案中看到的解决这个问题的最干净和最简单的实现。
    【解决方案2】:

    如果您使用的是 POSIX 系统,则可以使用gettimeofday(3)

    struct timeval start, end;
    gettimeofday(&start, NULL);
    ...
    gettimeofday(&end, NULL);
    
    // Watch out for overflow!
    int delta_milliseconds = 1000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec)/1000;
    

    如果你在 Windows 上,你可以使用GetTickCount:

    DWORD start, end;
    start = GetTickCount();
    ...
    end = GetTickCount();
    int delta_milliseconds = end - start;
    

    但要知道GetTickCount 的分辨率只有大约 10-16 毫秒。如果您需要更高的精度,请改用QueryPerformanceCounterQueryPerformanceFrequency

    // Error-checking omitted for expository purposes
    LARGE_INTEGER freq, start, end;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&start);
    ...
    QueryPerformanceCounter(&end);
    double delta_milliseconds = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart * 1000.0;
    

    【讨论】:

    • 嘿,谢谢亚当,但这会计算通话之间经过的时间。我需要计算当前系统时间,比如 12:30 并测量 12:30 和预定义时间之间的毫秒数,比如 16:00
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多