Как сбросить значение chrono::duration?

Я хочу собрать время выполнения моей программы в части кода (отдельные функции), текущая стратегия состоит в том, чтобы рассчитать время выполнения (chrono::duration) для каждой части и суммируйте их вместе. Но мне приходится иметь дело с двумя разными случаями (дважды вызывать функции с разными входами), и я использую статическую переменную timer сохранить разделенные длительности. Теперь я хочу сбросить переменную до второго случая. Как я могу это сделать? Конечно, я могу использовать продолжительность двух последовательных system_clock::now(), но это кажется ненужным. Я старался timer = 0 или же timer(0)не работает. Пример:

class myClass {
  static std::chrono::milliseconds timer_A;
  void foo();
  void bar();
}

В файле cpp:

std::chrono::milliseconds timer_A(0);
foo() {
  ...
  // get someDuration1;
  timer_A += someDuration1;
  ....
}
bar() {
  ...
  // get someDuration2;
  timer_A += someDuration2;
  ...
  cout << timer_A.count();
}

E сть main() позвоню foo() а также bar() дважды. т.е.

int main() {
  if(someCondition) {
    foo();
    bar();
  }
  if(otherCondition) {
    // here I need reset timer_A to 0 s.t. record the runtime again, how        ??????????
    foo();
    bar();
  }

2 ответа

Мой ответ немного опоздал, но здесь идет:

timer_A = std::chrono::miliseconds::zero();

Вы также можете создать шаблон продолжительности, а затем использовать его функцию Zero(), чтобы вам не нужно было знать, в чем измеряется продолжительность (см. Ниже).

Chrono не имеет своего собственного класса таймера, но вы можете создать его очень легко:

//----------------------------------------------------------------
/* Timer
Simple timer class using C++11 chrono.
example use:
{
    Timer_t t; // use global typedef for standard timer.
    t.Start(); // start the timer.
    ... do something you want to time ...
    t.End();   // end the timer
    t.CalcDuration; // Calculate and store (inside the Timer class) the interval between start and end.
    cout << "Time in milliseconds: " << t.GetDuration().count() << end; // cout the interval
}
*/
template< typename precision = long double, typename ratio = std::milli >
class Timer final
{
public:
    //---------------- aliases ----------------
    using timeDuration_t = std::chrono::duration<precision, ratio>;
    using timePoint_t = std::chrono::time_point<std::chrono::system_clock, timeDuration_t>;
    using this_type = Timer< precision, ratio >;

    //---------------- special member functions ----------------
    // NOTE: all the default compiler generated member functions will suffice.

    //---------------- member functions ----------------

    //--------------------------------
    /* Start()
        Starts the timer.
    */
    inline void Start()
    {
        m_start = std::chrono::system_clock::now();
    }

    //--------------------------------
    /* End()
        Ends the timer.
    */
    inline void End()
    {
        m_end = std::chrono::system_clock::now();
    }

    //--------------------------------
    /* CalcDuration()
        Calculates the time elapsed (duration)
        in between the previous calls to Start and End().

        NOTE: make sure to have called Start() and End() before calling this function.
        NOTE: Start() and End() can be called in any order.
    */
    void CalcDuration()
    {
        m_duration = std::max( m_start, m_end ) - std::min( m_start, m_end );
    }

    //--------------------------------
    /* GetDuration()
        Returns the calculated duration.

        NOTE: make sure to call CalcDuration() before calling this function.
    */
    timeDuration_t const& GetDuration() const
    {
        return m_duration;
    }

    //--------------------------------
    /* Zero()
        Zeros the internal members, effectively resetting the Timer.
    */
    void Zero()
    {
        m_start = timeDuration_t::zero();
        m_end = m_start;
        m_duration = m_end;
    }

    //--------------------------------
    /* TestLatency( i_count )
        Tests the latency / error of the timer class.

        NOTE: this number is how inaccurate your timings can be.
    */
    static timeDuration_t TestLatency( size_t const i_count = 512 )
    {
        this_type t;
        timeDuration_t tSum = timeDuration_t::duration::zero();
        for( size_t i = 0; i < i_count; ++i )
        {
            t.Start();
            t.End();
            t.CalcDuration();
            tSum += t.GetDuration();
        }
        return tSum / i_count;
    }

private:
    //---------------- private member data ----------------
    timePoint_t     m_start;
    timePoint_t     m_end;
    timeDuration_t  m_duration;
};

using Timer_t = Timer<>;

Если это тип миллисекунды: timer_A = milliseconds(0);

Другие вопросы по тегам