std::chrono::high_resolution_lock の解像度の不一致
std::cout にかかる時間を測定するように設計されたテスト プログラムでは、出力は、予想される 100 ナノ秒の分解能から一貫して高い偏差を示しています。 std::chrono::high_resolution_lock。代わりに、測定された持続時間の範囲は 1 ~ 2 マイクロ秒です。この不一致により、報告された分解能と時間測定方法の精度について疑問が生じます。
分解能に影響を与える要因
周期によって報告されるクロックの分解能。測定できる時間の最小単位です。 Visual Studio 2012 には高解像度のクロックが含まれていますが、残念ながら精度が低く、通常は約 1 ミリ秒の解像度を示します。これは、Visual Studio 2012 が high_resolution_ Clock を system_ Clock に再定義するため、本質的に精度が低いことが原因です。
Visual Studio 2012 の代替高解像度クロック
に対処するにはこの制限がある場合は、QueryPerformanceCounter 関数を使用して、より正確な高解像度クロックを実装できます。オペレーティング システムによって提供されます。以下に提供されている HighResClock クラスは、QueryPerformanceCounter を利用してマイクロ秒レベルの精度で信頼性の高いクロックを提供することでこの問題に対処しています。
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() { LARGE_INTEGER count; QueryPerformanceCounter(&count); return time_point(duration(count.QuadPart * static_cast<rep>(period::den) / g_Frequency)); } }; namespace { const long long g_Frequency = []() -> long long { LARGE_INTEGER frequency; QueryPerformanceFrequency(&frequency); return frequency.QuadPart; }(); }
この代替クロックは既存のコードにシームレスに統合でき、コード内でも高解像度の時間測定が可能です。 Visual Studio 2012 の制約。
以上がVisual Studio 2012 で std::chrono::high_resolution_ Clock が予想よりも低い解像度を報告するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。