понедельник, 6 марта 2017 г.

C++: Измерение интервалов с использованием steady_clock

Библиотека sys/time.h, она же Манька Аблигация  ctime - на самая лучшая штука, когда нужно не абсолютное время (с использованием gettimeofday() ), а интервальные замеры - например, для профилирования и тому подобных задач.

Лишние движения арифметические и тому подобное.

Кроме того, время может прыгать (например, при выполнении синхронизаций NTP).

Логически более правильно для подобных задач воспользоваться steady_clock - в большинстве реализаций они действительно steady. Да и считать в коде придется чуть меньше.

Простенько и со вкусом:

 #include <chrono>  
   
 std::chrono::steady_clock::time_point t1, t2;  
 std::chrono::duration<double> elapsedTime;  
   
 int main(int argc, char* argv[])  
 {  
   
  t1 = std::chrono::steady_clock::now();  
   
   /* Some stuff */  
   
  t2 = std::chrono::steady_clock::now();  
   
  /* Compute elapsed time in ms */  
  std::chrono::duration<double, std::milli> elapsedTime = t2 - t1;     /* Fractional duration: no duration_cast needed */  
   
  std::cout << "Time: " << std::to_string(elapsedTime.count()) << " ms" << std::endl;  
 }  
   

Для контраста посмотрим, что было раньше:

 #include <ctime>     /* for gettimeofday() */  
   
 timeval t1, t2;  
 double elapsedTime;  
   
 int main(int argc, char* argv[])  
 {  
   
  gettimeofday(&t1, nullptr);  
   
  /* Some stuff */  
    
  gettimeofday(&t2, nullptr);  
   
   
  /* Compute elapsed time in ms */  
  elapsedTime = (t2.tv_sec - t1.tv_sec) * 1000.0;          /* sec to ms */  
  elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000.0;     /* us to ms */  
        
  std::cout << "Time: " << std::to_string(elapsedTime) << " ms" << std::endl;  
   
 }  
   

Не слишком изящно, не правда ли?