std::chrono::high_resolution_ Clock の精度が測定値と一致しないのはなぜですか?
問題:
以下のテストプログラムでは、std::cout の実行時間を計測しようとしていますが、計測結果が得られません。一貫性があり、常に 1 または 2 マイクロ秒です。これは、std::chrono::high_resolution_ Clock の精度が 100 ナノ秒に達していないか、std::cout の実行時間を測定するコードに問題があるためです。
#include <iostream> #include <chrono> using std::chrono::nanoseconds; using std::chrono::duration_cast; int main() { std::cout << "Resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num / std::chrono::high_resolution_clock::period::den * 1000 * 1000 * 1000 << std::endl; auto t1 = std::chrono::high_resolution_clock::now(); std::cout << "How many nanoseconds does std::cout take?" << std::endl; auto t2 = std::chrono::high_resolution_clock::now(); auto diff = t2 - t1; nanoseconds ns = duration_cast<nanoseconds>(diff); std::cout << "std::cout takes " << ns.count() << " nanoseconds" << std::endl; }
答え:
Visual Studio 2012 では、std::chrono::high_resolution_ Clock が system_lock として定義されているため、精度が低くなります (約 1 ミリ秒) )。精度を高めるために、次のカスタム高解像度クロックを使用できます:
HighResClock.h
struct HighResClock { typedef long long rep; typedef std::nano period; typedef std::chrono::duration<rep, period> duration; typedef std::chrono::time_point<HighResClock> time_point; static const bool is_steady = true; static time_point now(); };
HighResClock.cpp
namespace { const long long g_Frequency = []() -> long long { LARGE_INTEGER frequency; QueryPerformanceFrequency(&frequency); return frequency.QuadPart; }(); } HighResClock::time_point HighResClock::now() { LARGE_INTEGER count; QueryPerformanceCounter(&count); return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency)); }
このクロックは、高精度の時間測定のために std::chrono::high_resolution_ Clock の代わりに使用できます。
以上が`std::chrono::high_resolution_lock` の精度が測定値と異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。