我一直在閱讀關於這一點,並且數字沒有加起來。在我的操作系統(Windows),我可以檢查系統時鐘的分辨率是這樣的:std :: chrono似乎沒有給出準確的時鐘分辨率/頻率
LARGE_INTEGER largeInt; // Basically a struct/union containing a long long
QueryPerformanceFrequency(&largeInt);
// largeInt now holds the frequency of my system's clock, it's 3903987
// This ends up being a resolution of about 256 nanoseconds
所有這些都是好的,但現在我想使用std ::時辰檢查相同的細節。根據cppreference.com和本網站的一個流行答案,std :: chrono時鐘的週期是一個編譯時間比率,由分子和分母組成,它指定了tick之間的秒數。
cppreference.com:
週期:表示蜱週期(每 蜱iethe秒數)
而且從堆棧溢出回答一個 的std ::比
最小可表示持續時間爲 high_resolution_clock :: period :: num/ high_resolution_clock :: period :: den秒。你可以像這樣 打印:
std::cout <<
(double)std::chrono::high_resolution_clock::period::num/
std::chrono::high_resolution_clock::period::den;
所以,我想:
// On Windows the result is typedeffed as intmax_t, which is a typedef for a long long
intmax_t numerator = std::chrono::high_resolution_clock::period::num;
intmax_t denominator = std::chrono::high_resolution_clock::period::den;
// numerator is 1 and denominator is one billion, which would suggest a
// tick period of one nanosecond?
根據什麼解釋了我的系統的時鐘能夠在一個納秒的分辨率?操作系統似乎並不這麼認爲。我也嘗試了一些支持我的系統時鐘頻率在3903987左右的其他工具,所以我不明白它如何管理比這更好的分辨率。
雖然high_resolution_clock :: is_steady結果爲true,但我不確定頻率是否隨CPU功率設置/升壓模式變化而變化。我重新啓動計算機兩次,得到3903994和3903991的頻率計數器,所以每次啓動這個數字似乎都會改變。我想這在編譯時計算時鐘並不理想,而不是開始運行程序。
那麼有什麼方法可以用std :: chrono獲得系統時鐘的實際分辨率/頻率?
這似乎是您必須在處理器製造商手冊中閱讀的內容,而不是通過軟件測試才能達到合理的準確度。現代處理器也一直在改變它們的頻率,所以它的價值也是如此。 – nwp
@nwp所以沒有可靠一致的時鐘這樣的事情?我知道處理器以不同的速度運行,但就計時系統而言,硬件之間沒有標準給出相同的結果? – Zebrafish
時鐘是令人驚訝的複雜的野獸。您可以以某種精度獲取當前時間,但結果會立即出錯。你究竟想實現什麼?微基準? – nwp