C++

C++ - chrono

Posted by Rico's Nerd Cluster on March 18, 2023

Basic Timing: high-resolution clock

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <chrono>

void foo(){
    auto start = std::chrono::high_resolution_clock::now();
    std::cout<<"Hello World";
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::nano> duration_ns = end - start;
    std::chrono::duration<double, std::micro> duration_us = end - start;
    std::chrono::duration<double, std::milli> duration_ms(start-end);
    std::chrono::duration<double> duration_s(start-end);

    std::chrono::duration<double, std::ratio<60>> duration_min = end - start;
    std::chrono::duration<double, std::ratio<3600>> duration_hr = end - start;
    std::cout << "Took " << duration_s.count() << " ms\n";  // see Hello WorldTook -1.2644e-05 ms
}
  • Here, we get duration_X in double. By default, std::chrono::duration<TYPE> returns a long int
  • If we accidentally called start-end, we see negative time value.
  • Notice that below seconds, we have std::nano, etc. Above seconds, we use std::ratio.

Time Conversion To ns, us, s, hour

Use std::duration_cast. It will return a long int.

1
2
3
4
5
6
7
8
9
void print_in_different_units( std::chrono::duration<double, std::milli> duration){
    long int ns = std::chrono::duration_cast<std::chrono::nanoseconds>(duration).count();
    long int us = std::chrono::duration_cast<std::chrono::microseconds>(duration).count();
    long int ms = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
    long int s = std::chrono::duration_cast<std::chrono::seconds>(duration).count();
    long int m = std::chrono::duration_cast<std::chrono::minutes>(duration).count();
    long int h = std::chrono::duration_cast<std::chrono::hours>(duration).count();
    std::cout << "Took " << ns << " ns\n";
}