簡體   English   中英

std::chrono 納秒計時器適用於 MSVC,但不適用於 GCC

[英]std::chrono nanosecond timer works on MSVC but not GCC

我有一個簡單的程序,它使用chrono來進行我從 MSVC 移植到 Code::Blocks 的計時。 程序的顯示屏顯示從它開始到小數點后 16 位的增量時間。 編譯后,我注意到計時器僅從小數點后 6 位開始向上移動。 代碼保持不變,仍然使用std::chrono::high_resolution_clock::now(); 時間,然后計算我使用的增量時間

double localDeltaTime = std::chrono::duration_cast<std::chrono::nanoseconds>(m_EndTime - m_StartTime).count();
localDeltaTime = localDeltaTime / 1000000000.0;

這清楚地顯示了納秒計時,但 GCC 似乎只做微秒? 這是一個已知的問題?

編輯:

這是一個MRE,

#include <chrono>
#include <iostream>
#include <iomanip>

int main()
{
    std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
    std::chrono::high_resolution_clock::time_point finish = start;

    while (true)
    {
        finish = std::chrono::high_resolution_clock::now();

        long double deltaTime = std::chrono::duration_cast<std::chrono::nanoseconds>(finish - start).count();
        deltaTime /= 1000000000.0;

        std::cout << std::setprecision(25) << deltaTime << std::endl;
    }


    return 0;
}

這是一個已知的 MinGW 問題#5086

它提到了這些可能的解決方法:

關於 MSVC:

首先,在 Windows 上,可能的最佳用戶空間定時器分辨率為 100 ns。

在 MSVC system_clocksteady_clock都支持這個分辨率,所以你應該看到 7 個十進制數字在變化。

但是寫入std::cout需要很長時間,大約 1 毫秒。 這就是為什么你在你的版本中看到大的時間步長的原因,你本質上是在測量std::cout時間。

我重寫了測試以打印時間點的最小變化:

#include <chrono>
#include <iostream>
#include <iomanip>
using namespace std::literals;

template<class Clock>
void runTest() {
    std::cout << typeid(Clock).name() << '\n';
    for (int i = 0; i < 5; i++) {
        auto start = Clock::now();
        for (;;) {
            auto finish = Clock::now();
            if (finish != start) {
                std::cout << std::fixed << std::setprecision(9) << (finish - start) / 1.0s << '\n';
                break;
            }
        }
    }
}

int main() {
    runTest<std::chrono::system_clock>();
    runTest<std::chrono::steady_clock>();
    runTest<std::chrono::high_resolution_clock>();
}

這是我得到的 output:

MSVC 19.28(VS 2019):

struct std::chrono::system_clock
0.000000200
0.000000100
0.000000100
0.000000100
0.000000100
struct std::chrono::steady_clock
0.000000100
0.000000100
0.000000100
0.000000200
0.000000100
struct std::chrono::steady_clock
0.000000200
0.000000100
0.000000100
0.000000100
0.000000100

MinGW-w64 GCC 10.2.0(Rev1,由 MSYS2 項目構建):

NSt6chrono3_V212system_clockE
0.000999200
0.000998600
0.000999900
0.001000800
0.000999400
NSt6chrono3_V212steady_clockE
0.000000100
0.000000100
0.000000100
0.000000100
0.000000100
NSt6chrono3_V212system_clockE
0.000999900
0.001001900
0.001006200
0.001016600
0.000980700

所以在 MinGW 的情況下,我們可以看到至少steady_clock提供 100 ns 的分辨率,但不幸的是high_resolution_clocksystem_clock的別名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM