Using std::chrono::high_resolution_clock Example

5 years a go I’ve showed how to use clock_gettime to do basic high_resolution profiling. The approach there is very useful, but unfortunately, not cross-platform. It works only on POSIX compliant systems (especially not windows).

Luckily, the not-so-new C++11 provides, among other things, interface to high-precision clocks in a portable way. It’s still not a perfect solution, as it only provides wall-time (clock_gettime can give per process and per thread actual CPU time as well). However, it’s still nice.

#include <iostream>
#include <chrono>
using namespace std;
 
int main()
{
	cout << chrono::high_resolution_clock::period::den << endl;
	auto start_time = chrono::high_resolution_clock::now();
	int temp;
	for (int i = 0; i< 242000000; i++)
		temp+=temp;
	auto end_time = chrono::high_resolution_clock::now();
	cout << chrono::duration_cast<chrono::seconds>(end_time - start_time).count() << ":";
	cout << chrono::duration_cast<chrono::microseconds>(end_time - start_time).count() << ":";
	return 0;
}

I’ll explain a bit the code. chrono is the new header files that provides various time and clock related functionality of the new standard library. high_resolution_clock should be, according to the standard, the clock with the highest precision.

cout << chrono::high_resolution_clock::period::den << endl;

Note, that there isn’t a guarantee how many the ticks per seconds it has, only that it’s the highest available. Hence, the first thing we do is to get the precision, by printing how many many times a second the clock ticks. My system provides 1000000 ticks per second, which is a microsecond precision.

Getting the current time using now() is self-explanatory. The possibly tricky part is

cout << chrono::duration_cast<chrono::seconds>(end_time - start_time).count() << ":";

(end_time - start_time) is a duration (newly defined type) and the count() method returns the number of ticks it represents. As we said, the number of ticks per second may change from system to system, so in order to get the number of seconds we use duration_cast. The same goes in the next line for microseconds.

The standard also provides other useful time units such as nanoseconds, milliseconds, minutes and even hours.

3 thoughts on “Using std::chrono::high_resolution_clock Example”

  1. This has the same problem as clock(). I’m hitting a limit at 1 ms though any machine can clearly do more than 1000 operations per second. Here’s an example:

    #include
    #include
    using namespace std;

    int main()
    {
    cout << chrono::high_resolution_clock::period::den << endl;
    int temp;
    auto end_time = chrono::high_resolution_clock::now();
    while (true)
    {
    auto start_time = end_time;
    end_time = chrono::high_resolution_clock::now();
    cout << chrono::duration_cast<chrono::duration>(end_time – start_time).count() << endl;
    }
    return 0;
    }

  2. The resolution of the timers also seems dependent on compiler and library implementation. On OS X the version of clang packaged with Xcode gives a resolution of nanoseconds, but the version of GCC-4.9 provided by macports gives millisecond resolution.

Leave a Reply

Your email address will not be published. Required fields are marked *