【问题标题】:Portable way of counting milliseconds in C++?在 C++ 中计算毫秒的便携式方法?
【发布时间】:2011-03-01 14:19:03
【问题描述】:

是否有任何可移植的(Windows 和 Linux)方法来计算两次调用之间经过的毫秒数?

基本上,我想实现与.NETStopWatch 类相同的功能。 (对于已经使用过的人)

在一个完美的世界中,我会使用boost::date_time,但由于我必须遵守一些愚蠢的规则,这不是一个选择。

对于那些更好地阅读代码的人,这是我想要实现的。

Timer timer;

timer.start();
// Some instructions here
timer.stop();

// Print out the elapsed time
std::cout << "Elapsed time: " << timer.milliseconds() << "ms" << std::endl;

那么,如果有一个可移植(一组)函数可以帮助我实现Timer 类,它是什么?如果没有这样的功能,我应该使用什么 Windows 和 Linux API 来实现这个功能? (使用#ifdef WINDOWS-like 宏)

谢谢!

【问题讨论】:

    标签: c++ windows linux time portability


    【解决方案1】:

    这是我执行此任务的代码(Boost 许可证) 其中 ptime 是表示时间的类,以秒 + 纳秒为单位 ptime(int sec,int nano)

    而 ptime::microseconds 从 posix 时间微秒创建 sec/nano 对。

    很容易根据需要重写它并编写这样的类。

    ptime ptime::now()
    {
        #ifndef BOOSTER_WIN_NATIVE
        struct timeval tv;
        gettimeofday(&tv,0);
        return ptime(tv.tv_sec,tv.tv_usec * 1000);
        #else
        FILETIME ft;
        GetSystemTimeAsFileTime(&ft);
        unsigned long long tt = ft.dwHighDateTime;
        tt <<=32;
        tt |= ft.dwLowDateTime;
        tt /=10;
        tt -= 11644473600000000ULL;
        return ptime(ptime::microseconds(tt));
        #endif
    }
    

    而且没有可移植的 C++ 函数...

    【讨论】:

      【解决方案2】:

      在 Windows 上,使用高性能计时器,轻而易举。

      LARGE_INTEGER frequency;
      LARGE_INTEGER one;
      LARGE_INTEGER two;
      QueryPerformanceFrequency(&frequency);
      QueryPerformanceCounter(&one);
      // something
      QueryPerformanceCounter(&two);
      std::cout << (((double)two.QuadPart - (double)one.QuadPart) / (double)frequency.QuadPart) * (double)1000;
      

      理论上,这可以达到每个时钟周期的精度,具体取决于相关 CPU。

      【讨论】:

      • 但 ereOn 要求提供便携式解决方案,这是 Windows 特定的
      • 如果没有这个功能,我应该使用什么 Windows & Linux API 来实现这个功能? (使用#ifdef WINDOWS 类宏)
      • 无论如何,在这些多核 CPU 时代,这都不是一个好的解决方案 - 系统中每个内核的 HPT 可能不同,如果你的线程最终在内核之间切换,你就完蛋了:msdn.microsoft.com/en-us/library/ms644904(VS.85).aspx
      • 嗯。我已经看到了,但我从未真正听说过或观察到任何此类。 MSDN 明确指出,这仅是由于 BIOS 或 HAL 错误而发生的,如果这些错误,则没有什么可以依赖的。
      【解决方案3】:

      clock()(在 Time.h 中)返回一个每秒增加 CLOCKS_PER_SEC 的值,通常为 1000。

      【讨论】:

      • clock() 计算 CPU 时间,而不是挂钟时间。
      【解决方案4】:

      在 Linux 上(通常在 POSIX 中),您可以使用 gettimeofday 函数,它返回自 Epoch 以来的微秒数。在 Windows 上,有 GetTickCount 函数,它返回系统启动后的毫秒数。

      【讨论】:

      • clock_gettime(CLOCK_MONOTONIC, ...) 更适合测量经过的时间,因为它不会受到系统时钟更改的影响。
      • 据我所知clock_gettime 没有在 mac 上实现,这可能会使其不适用于某些便携式应用程序。
      猜你喜欢
      • 1970-01-01
      • 2023-02-21
      • 2021-12-25
      • 2011-01-26
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多