重複の可能性:
ナノ秒単位で時間を提供するC++タイマー関数
関数の実行時間をナノ秒の解像度で測定する必要があります。出来ますか?私たちの通常のコンピューターのハードウェアとソフトウェアは、時間に対してそのような精度を与えることができますか?はいの場合、C ++でそれを達成する方法は?Boostライブラリで可能ですか?
重複の可能性:
ナノ秒単位で時間を提供するC++タイマー関数
関数の実行時間をナノ秒の解像度で測定する必要があります。出来ますか?私たちの通常のコンピューターのハードウェアとソフトウェアは、時間に対してそのような精度を与えることができますか?はいの場合、C ++でそれを達成する方法は?Boostライブラリで可能ですか?
はい、今日、ほとんどのハードウェアはこの種の解決策をサポートしており、C++標準ライブラリにはそれもサポートできるAPIがあります。残念ながら、C++のすべての実装が実際にそれを提供するわけではありません。
APIは、<chrono>
C++11で導入されたライブラリです。
#include <iostream>
#include <chrono>
int main() {
auto start = std::chrono::high_resolution_clock::now();
// operation to be timed ...
auto finish = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count() << "ns\n";
}
ダーウィンのlibc++での<chrono>
実装はナノ秒の解像度を提供しますが、VS2012での実装は10分の1ミリ秒に過ぎないようです。上記のコードは、ナノ秒単位で時間を示しますが、100マイクロ秒未満のタイミングは最終的にゼロナノ秒になります。
Boostは、Windowsではナノ秒を使用しているように見える実装boost::chronoも提供します。C++03でも使用できます。
#include <boost/chrono.hpp>
int main() {
boost::chrono::high_resolution_clock::time_point t1 =
boost::chrono::high_resolution_clock::now();
boost::chrono::high_resolution_clock::time_point t2 =
boost::chrono::high_resolution_clock::now();
std::cout << boost::chrono::duration_cast<boost::chrono::nanoseconds>(t2-t1) << "\n";
// boost chrono has more advanced output, .count() isn't needed, nor is manually writing out the units
}
あなたが時計を探しているのかdifftimeを探しているのかはわかりませんが、これらの1つがあなたが探しているものであるはずです:
http://www.cplusplus.com/reference/clibrary/ctime/clock/
http://www.cplusplus.com/reference/clibrary/ctime/difftime/
これを関数の前後で使用し、ランタイムの違いを比較して、関数の全体的なランタイムを確認できます。
Windows APIでできる最善のことは、QueryPerformanceCounterです。その解決策は、 QueryPerformanceFrequencyを使用して取得できます。状況によっては、CPUのRDTSC命令を使用する場合があります。この場合、周波数は基本的にCPUのクロック周波数になります。それ以外の場合は、周波数が1.024 MHzの別のクロックを使用するため、分解能は基本的に1マイクロ秒です。
C ++ 11は、chrono
同様に役立つ可能性のあるクラスを追加します-すでにそれを持っているコンパイラーを使用していると仮定します。コンパイラーが実装を提供しない場合、Boost Chronoは、ほとんどの既存のコンパイラー/ライブラリーで機能する合理的な代替手段です。繰り返しになりますが、ナノ秒の解像度を提供するという保証はありませんが、WindowsではおそらくQPC / QPFのポータブルラッパーになると思います。したがって、おそらく同じ解像度を、より移植性の高い方法で提供します。
そしてもちろん、古き良きBoost :: date_time:もあります。
#include <boost/date_time/posix_time/posix_time.hpp>
boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();
ただし、マイクロ秒のみ。