亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

std :: chrono :: high_resolution_clock的分辨率與測量不對應

std :: chrono :: high_resolution_clock的分辨率與測量不對應

C++
月關寶盒 2019-10-11 10:27:53
讓我通過這個測試程序問我的問題:#include <iostream>#include <chrono>using std::chrono::nanoseconds;using std::chrono::duration_cast;int main(int argc, char* argv[]){    std::cout << "resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num        / std::chrono::high_resolution_clock::period::den * 1000 * 1000 * 1000 << std::endl;    auto t1 = std::chrono::high_resolution_clock::now();    std::cout << "how much nanoseconds std::cout takes?" << std::endl;    auto t2 = std::chrono::high_resolution_clock::now();    auto diff = t2-t1;    nanoseconds ns = duration_cast<nanoseconds>(diff);    std::cout << "std::cout takes " << ns.count() << " nanoseconds" << std::endl;    return 0;}我的機器上的輸出:分辨率(納米)= 100std :: cout需要多少納秒?std :: cout需要1000200納秒結果是我收到1000200或1000300或1000400或1000500或1000600或2000600(= 1或2微秒)。顯然,無論是分辨率std::chrono是不是 100毫微秒或我衡量的時間的方式std::cout是錯誤的。(例如,為什么我從來沒有收到1到2微秒之間的信號1500000?)我需要C ++中的高分辨率計時器。操作系統本身提供了高分辨率計時器,因為我可以Stopwatch在同一臺計算機上使用C#類以微秒級的精度進行測量。因此,我只需要正確使用操作系統所具有的高分辨率計時器即可!如何修復程序以產生預期的結果?
查看完整描述

3 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

我猜你正在使用VS2012;如果不是,請忽略此答案。VS2012 typedef的high_resolution_clock到system_clock??杀氖牵@意味著它的精度很差(大約1毫秒)。我寫了一個更好的高分辨率時鐘,QueryPerformanceCounter用于VS2012。


HighResClock.h:


    struct HighResClock

    {

        typedef long long                               rep;

        typedef std::nano                               period;

        typedef std::chrono::duration<rep, period>      duration;

        typedef std::chrono::time_point<HighResClock>   time_point;

        static const bool is_steady = true;


        static time_point now();

    };

HighResClock.cpp:


namespace

{

    const long long g_Frequency = []() -> long long 

    {

        LARGE_INTEGER frequency;

        QueryPerformanceFrequency(&frequency);

        return frequency.QuadPart;

    }();

}


HighResClock::time_point HighResClock::now()

{

    LARGE_INTEGER count;

    QueryPerformanceCounter(&count);

    return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency));

}

(我省略了一個斷言和#ifs來查看上面的代碼是否在2012年對其進行了編譯)


您可以在任何地方以與標準時鐘相同的方式使用此時鐘。


查看完整回答
反對 回復 2019-10-11
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

時鐘的分辨率不一定與可由時鐘使用的數據類型表示的最小持續時間相同。在這種情況下,您的實現使用的數據類型可以表示持續時間僅為100納秒,但是底層時鐘實際上沒有這樣的分辨率。


high_resolution_clock多年來,Visual Studio的低分辨率一直是一個問題。微軟的C ++標準庫維護者Stephan T. Lavavej 表示,這已在VS2015中通過使用進行了修復QueryPerformanceCounter()。


查看完整回答
反對 回復 2019-10-11
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

也許實現未實現更高分辨率的計時器?


似乎您正在使用Windows(提到C#),因此,如果您使用計時器,并且確實在使用Windows,則可以使用QueryPerformanceFrequency和QueryPerformanceCounter。


查看完整回答
反對 回復 2019-10-11
  • 3 回答
  • 0 關注
  • 1000 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號