Measuring how long your program ran for is easy with
std::chrono, but what if you need details about user and system space time? Easy! Use Boost CPU Timer library 🙂 It’s another simple library from Boost with only few classes:
auto_cpu_timeris like a RAII object; it starts the clock in its constructor, stops it in its destructor, and prints the elapsed time to standard output.
cpu_timerclass is for manual starting and stopping of the clock; it also allows you to retrieve the elapsed times (wall, user, and system) in nanoseconds.
In the below example I create three threads:
procUserspends 100% of its time in the user space calling
std::sqrtfunction.
procSystemspawns a lot of threads causing transitions into the kernel. And
procTimeris just an illustration of
cpu_timerusage.
#include#include #include #include #include using namespace std; using namespace boost::timer; int main() { srand((unsigned int)time(NULL)); auto_cpu_timer program_timer(3); auto procUser = [](long work) { for (long i = 0; i < work; ++i) sqrt(123.456L); }; auto procSystem = [](long work) { for (long i = 0; i < work; ++i) thread([](){}).detach(); }; auto procTimer = [](long work) { cpu_timer timer; timer.start(); for(long i = 0; i < work; ++i) rand(); timer.stop(); cout << "Thread timer:" << timer.format(3); }; thread t1(procUser, 1000000000); thread t2(procSystem, 100000); thread t3(procTimer, 100000000); t1.join(); t2.join(); t3.join(); cout << "Program timer:"; return 1; }
Thread timer: 0.750s wall, 1.790s user + 0.850s system = 2.640s CPU (352.1%)
Program output.
Program timer: 3.171s wall, 5.080s user + 2.980s system = 8.060s CPU (254.2%)