C++11stlintermediate
std::chrono::steady_clock (C++11 Addition)
C++11 · Modern Revolution · Compiler flag: -std=c++11
Explanation
A monotonic clock that is guaranteed to never go backwards, making it ideal for measuring elapsed time. Unaffected by system clock adjustments.
Real-World Scenario
Measure the execution time of an algorithm for performance benchmarking.
Quick Snippet
snippet.cpp
#include <chrono>
auto start = std::chrono::steady_clock::now();
// ... work ...
auto end = std::chrono::steady_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);Full Example
steady_clock.cpp
// CodeNebula - C++11 Example: steady_clock
// Compile: g++ -std=c++11 -Wall -Wextra -o example steady_clock.cpp
// Demonstrates std::chrono::steady_clock: a monotonic clock ideal for
// measuring elapsed time and benchmarking.
#include <iostream>
#include <chrono>
#include <vector>
#include <algorithm>
#include <numeric>
int main() {
using namespace std::chrono;
// steady_clock is guaranteed to be monotonic
std::cout << "steady_clock is_steady: "
<< std::boolalpha << steady_clock::is_steady << "\n";
// Benchmark: sorting a vector
const int N = 100000;
std::vector<int> data(N);
std::iota(data.begin(), data.end(), 0);
std::reverse(data.begin(), data.end());
steady_clock::time_point start = steady_clock::now();
std::sort(data.begin(), data.end());
steady_clock::time_point end = steady_clock::now();
auto elapsed_us = duration_cast<microseconds>(end - start).count();
auto elapsed_ms = duration_cast<milliseconds>(end - start).count();
std::cout << "Sorted " << N << " integers\n";
std::cout << "Elapsed: " << elapsed_us << " microseconds ("
<< elapsed_ms << " ms)\n";
// Measure a tight loop
start = steady_clock::now();
volatile long sum = 0;
for (int i = 0; i < 1000000; ++i) {
sum += i;
}
end = steady_clock::now();
auto loop_ns = duration_cast<nanoseconds>(end - start).count();
std::cout << "Loop sum: " << sum << "\n";
std::cout << "Loop elapsed: " << loop_ns << " nanoseconds\n";
// Two successive calls — monotonic guarantee
auto t1 = steady_clock::now();
auto t2 = steady_clock::now();
std::cout << "t2 >= t1: " << std::boolalpha << (t2 >= t1) << "\n";
return 0;
}
// Expected output (timings will vary):
// steady_clock is_steady: true
// Sorted 100000 integers
// Elapsed: 8500 microseconds (8 ms)
// Loop sum: 499999500000
// Loop elapsed: 2500000 nanoseconds
// t2 >= t1: true
Run command
g++ -std=c++11 -Wall -Wextra -o example steady_clock.cpp