Использование Chrono для измерения времени - PullRequest
2 голосов
/ 21 октября 2019

Я работал с библиотекой 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 ()?

1 Ответ

4 голосов
/ 21 октября 2019

Вот небольшое переписывание вашего 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 всегда равно typedef или steady_clockили system_clock. См. https://stackoverflow.com/a/31553641/576911 разницу между этими двумя часами. Я предпочитаю выбрать либо steady_clock, либо system_clock, поэтому я знаю, что получаю.

  • std::chrono::steady_clock::time_point - это просто более краткий способ назвать тип std::chrono::time_point<std::chrono::steady_clock>,Оба являются правильными.

  • Когда вы вычитаете два time_point s, вы получаете длительность. Проще просто вычесть time_point с, получить длительность, а затем привести ее к желаемой точности. То, что у вас есть, не является неправильным, просто более сложным и менее безопасным способом достижения того же результата.

  • К сожалению, для печати необходимо извлечь целое значение из Duration с помощью.count() функция-член. Я избегаю этого до последнего утверждения, поскольку оно сродни опасному reinterpret_cast от продолжительности до целого. В C ++ 20 вам больше не нужно будет использовать .count() для печати длительностей.

  • Я предпочитаю выдавать using namespace std::chrono; в области видимости функции вместо записи std::chrono::, кратнойраз. Я просто нахожу это более читабельным, но это всего лишь мое субъективное мнение о читабельности.

...