C++chronoライブラリのsteady_clockとsystem_clock
が提供される.3種類の時計が入っていますclock, system_clockとhigh_resolution_clock; 区別する
リファレンスリンク[2]には、自分のマシン上の3種類のクロックの時間精度を表示できるコードが提供されている.
// copied from http://www.informit.com/articles/article.aspx?p=1881386&seqNum=2;
// Author: Nicolai M. Josuttis
#include
#include
#include
template
void printClockData ()
{
using namespace std;
cout << "- precision: ";
// if time unit is less or equal one millisecond
typedef typename C::period P;// type of time unit
if (ratio_less_equal::value) {
// convert to and print as milliseconds
typedef typename ratio_multiply
::type TT;
cout << fixed << double(TT::num)/TT::den
<< " milliseconds" << endl;
}
else {
// print as seconds
cout << fixed << double(P::num)/P::den << " seconds" << endl;
}
cout << "- is_steady: " << boolalpha << C::is_steady << endl;
}
int main()
{
std::cout << "system_clock: " << std::endl;
printClockData<:chrono::system_clock>();
std::cout << "
high_resolution_clock: " << std::endl;
printClockData<:chrono::high_resolution_clock>();
std::cout << "
steady_clock: " << std::endl;
printClockData<:chrono::steady_clock>();
#ifdef _WIN32
system("pause");
#endif
return 0;
}
system_clock:
- precision: 0.000100 milliseconds
- is_steady: false
high_resolution_clock:
- precision: 0.000001 milliseconds
- is_steady: true
steady_clock:
- precision: 0.000001 milliseconds
- is_steady: true
推奨
以下はstackoverflowの前の大物が提案したdifference between steady clocl vs system clockです.
count()
メソッドtime_since_epoch()
理由は、タイプの安全なメカニズムを提供し、ユーザーが単位換算を行う際のエラーを防止することである.しかし、この2つの関数は例外で、「非常口の役割」を果たしています.
Such emergencies arise when (for example) the committee neglects to give you all the tools you need to get the job done (such as I/O) for the types, or such as the need to interface with some other timing API via integers
I/Oまたは他の整数でパラメータを伝達する時間関数インタフェースで使用します.
使用方法
例:コードセグメントの実行時間をテストするマクロ
#include
#define TIMERSTART(tag) auto tag##_start = std::chrono::steady_clock::now(),tag##_end = tag##_start
#define TIMEREND(tag) tag##_end = std::chrono::steady_clock::now()
#define DURATION_s(tag) printf("%s costs %d s
",#tag,std::chrono::duration_cast<:chrono::seconds>(tag##_end - tag##_start).count())
#define DURATION_ms(tag) printf("%s costs %d ms
",#tag,std::chrono::duration_cast<:chrono::milliseconds>(tag##_end - tag##_start).count());
#define DURATION_us(tag) printf("%s costs %d us
",#tag,std::chrono::duration_cast<:chrono::microseconds>(tag##_end - tag##_start).count());
#define DURATION_ns(tag) printf("%s costs %d ns
",#tag,std::chrono::duration_cast<:chrono::nanoseconds>(tag##_end - tag##_start).count());
// usage:
// TIMERSTART(for_loop);
// for (int i = 0; i < 100000; i++)
// {
// i*i;
// }
// TIMEREND(for_loop);
// DURATION_ms(for_loop);
リファレンス