簡體   English   中英

使用 Chrono 進行時間測量

[英]Using Chrono for Time Measurement

我正在使用 Chrono 庫進行時間測量。 我找到了以下代碼,並且知道如何使用它。

class Timer {
private:
    std::chrono::time_point<std::chrono::high_resolution_clock> pr_StartTime;
    std::chrono::time_point<std::chrono::high_resolution_clock> pr_EndTime;

public:
    Timer() 
    {
        Start();
    }

    ~Timer() 
    {
        Finish();
    }

    void Start() 
    {
        pr_StartTime = std::chrono::high_resolution_clock::now();
    }

    void Finish()
    {
        pr_EndTime = std::chrono::high_resolution_clock::now();

        auto StartTimeMs = std::chrono::time_point_cast<std::chrono::microseconds>(pr_StartTime).time_since_epoch().count();
        auto EndTimeMs = std::chrono::time_point_cast<std::chrono::microseconds>(pr_EndTime).time_since_epoch().count();
        auto Duration = EndTimeMs - StartTimeMs;
        std::cout << "Duration " << Duration << " microseconds." << std::endl;
    }
};

但我沒有意識到為什么開發人員在鑄造步驟中使用 time_since_epoch().count() 。 為什么我們應該使用 time_since_epoch() 和 count()?

這是對您的Timer的輕微重寫。 我將在下面解釋我所做的每項更改:

class Timer {
private:
    std::chrono::steady_clock::time_point pr_StartTime;
    std::chrono::steady_clock::time_point pr_EndTime;

public:
    Timer() 
    {
        Start();
    }

    ~Timer() 
    {
        Finish();
    }

    void Start() 
    {
        pr_StartTime = std::chrono::steady_clock::now();
    }

    void Finish()
    {
        using namespace std::chrono;
        pr_EndTime = steady_clock::now();
        auto Duration = duration_cast<microseconds>(pr_EndTime-pr_StartTime);
        std::cout << "Duration " << Duration.count() << " microseconds." << std::endl;
    }
};
  • 我從high_resolution_clock切換到steady_clock因為high_resolution_clock始終是typedefsystem_clocksteady_clock 有關這兩個時鍾之間的差異,請參閱https://stackoverflow.com/a/31553641/576911 我更喜歡選擇steady_clocksystem_clock ,所以我知道我得到了什么。

  • std::chrono::steady_clock::time_point只是一種更簡潔的命名類型std::chrono::time_point<std::chrono::steady_clock>的方式。 兩者都是正確的。

  • 當您減去兩個time_point時,您會得到一個持續時間。 只需減去time_point ,獲取持續時間,然后將該持續時間轉換為所需的精度,就更簡單了。 你所擁有的並不是不正確的,只是一種更復雜、更不安全的方法來實現相同的結果。

  • 不幸的是,要打印,必須使用 .count .count()成員 function 從Duration中提取整數值。 我避免在最后一個語句之前這樣做,因為它類似於從持續時間到積分的危險reinterpret_cast 在 C++20 中,您將不再需要使用.count()來打印持續時間。

  • 我更喜歡發出using namespace std::chrono; 在 function scope 而不是多次寫入std::chrono:: 我只是覺得它更具可讀性,但這只是我對可讀性的主觀看法。

暫無
暫無

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

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