If you have a look around in the web, a solution to correctly measure time is to use a new C++ package: std::chrono , which is part of the standard C++ library.
So the aim of this article is to investigate if this solution can be used to have a very high resolution timer. If you remember well as we are doing small improvement we want to be able to measure the improvement (or degradation). of optimization.
First step is to
#include <chrono> #include <ratio> #include <climits> #include <algorithm> // std::max int main() { long long value = 0; double max = LONG_MIN ; double min = LONG_MAX; for (int i= 1;i<100;i++){ auto startInitial = std::chrono::high_resolution_clock::now(); auto endInitial = std::chrono::high_resolution_clock::now(); std::chrono::duration<double, std::nano > elapsedInitial = (endInitial - startInitial) ; max = std::max(max,elapsedInitial.count()); min = std::min(min,elapsedInitial.count()); value=value+elapsedInitial.count(); } std::cout <<"Sum for 100 loop"<<value<<" " <<value/100<<"ns"std::endl; std::cout<<" Max:" <<max <<"ns Min:"<<min<<"ns"<<std::endl; }
fflayol@:/tmp$ g++ test1.c -std=c++11;./a.out Sum for 100 loop: 2235 Mean: 22ns Max : 53ns Min : 21ns
This example shows that the call last at means 20ns which is quite too long for our purpose.
Indeed if we are trying to be more accurate:
#include <iostream> #include <chrono> #include <ratio> #include <climits> #include <algorithm> // std::max int main() { { long long value = 0; double max = LONG_MIN ; double min = LONG_MAX; for (int i= 1;i<100;i++){ auto startInitial = std::chrono::high_resolution_clock::now(); auto endInitial = std::chrono::high_resolution_clock::now(); std::chrono::duration<double, std::nano > elapsedInitial = (endInitial - startInitial) ; max = std::max(max,elapsedInitial.count()); min = std::min(min,elapsedInitial.count()); value=value+elapsedInitial.count(); } std::cout <<"Sum for 100 loop"<<value<<" " <<value/100<<"ns"<<std::endl; std::cout<<" Max:" <<max <<"ns Min:"<<min<<"ns"<<std::endl; } std::cout <<"Second function"<<std::endl; { long long value = 0; double max = LONG_MIN ; double min = LONG_MAX; for (int i= 1;i<100;i++){ auto startInitial = std::chrono::high_resolution_clock::now(); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); auto endInitial = std::chrono::high_resolution_clock::now(); std::chrono::duration<double, std::nano > elapsedInitial = (endInitial - startInitial) ; max = std::max(max,elapsedInitial.count()); min = std::min(min,elapsedInitial.count()); value=value+elapsedInitial.count(); } std::cout <<"Sum for 100 loop"<<value<<" " <<value/100<<"ns"<<std::endl; std::cout<<" Max:" <<max <<"ns Min:"<<min<<"ns"<<std::endl; } }