tl;dr
c++11からは時間計測のための関数も標準化されている。ただ使い方が複雑なので備忘録も兼ねて、処理をラップしたStopWatchクラスを作って掲載しておく。
# include <chrono>
struct StopWatch
{
StopWatch() { pre_ = std::chrono::high_resolution_clock::now(); }
//前回のlap関数コールからの経過時間をmilli sec単位で返す
double lap()
{
auto tmp = std::chrono::high_resolution_clock::now(); // 計測終了時刻を保存
auto dur = tmp - pre_;
pre_ = tmp;
return std::chrono::duration_cast<std::chrono::nanoseconds>(dur).count()/1000000.0;
}
std::chrono::high_resolution_clock::time_point pre_;
};
int main()
{
using namespace std;
int abc = 0;
//使い方
StopWatch sw;
//何か処理1
cout << "duration1:" << sw.lap() << endl;
//何か処理2
cout << "duration2:" << sw.lap() << endl;
//より厳密に計測するなら
sw.lap();
//何か処理3
auto dur = sw.lap();
cout << "duration3:" << dur << endl;
解説
今回は、nanosecまで精度を出せるようにしてdouble型で1.0が1msになるように変換している。また、時間の取得にはstd::chrono::high_resolution_clock::now()を使ったけど、Visual Studio 2017の場合、 std::chrono::high_resolution_clockは、std::chrono::steady_clockのエイリアスで、
std::chrono::steady_clockは、_Query_perf_frequencyと_Query_perf_counterを使っている。
ちなみに、精度は落ちるが、std::chrono::high_resolution_clock::now()の代わりに、std::chrono::system_clock::now()を使ってもよい。厳密に計測するならサンプルコードのように、標準出力のコードの前にlap()関数の結果をストアしてそれを表示するにしたほうが、出力処理を含まないより正確な計測結果を得られる。
補足
OpenCVを使うなら、cv::TickMeterもある。