LoginSignup
2
1

More than 1 year has passed since last update.

タイマ分解能精度評価(C++)

Last updated at Posted at 2022-02-06

概要

C++のタイマの分解能の精度に対してどのくらい誤差があるのかを測定してみた.

分解能
タイマが測定可能な時間粒度を指す.

測定

分解能の測定方法は参考資料[2]の3章に記載されている方法を参考にした.
使用したプログラムは参考資料[3]に対して複数の分解能を収集するように改造した.

収集した分解能に対して,箱ひげ図の表示と基本統計量の算出を行った。

githubには精度測定用のプログラムはアップしていない.

タイマのカウント更新タイミングが悪いせいなのか大きくブレてしまっている箇所がある.

分解能とレイテンシーの測定方法

Windows

Windowsのタイマは分解能のバラつきが少なく安定性の高いタイマが多い印象であった.

  • 開発環境:
    • Visual Studio 2022 community
  • PCスペック:
    • OS:Windows10 Pro(64bit)
    • CPU:Intel(R)Core(TM) i9-109000X 3.70Ghz(物理コア数:10, 論理コア数:20)
    • メインメモリ:128GB

ナノ秒タイマ

nano.png
基本統計量(10,000サンプル)

mean std min 25% 50% 75% max
chrono::system_clock 105.550 554.999 100 100 100 100 55,600
chrono::steady_clock 101.310 116.844 100 100 100 100 11,700
GetSystemTimePreciseAsFileTime 100.060 5.999 100 100 100 100 700
QueryPerformanceCounter 100.190 19.000 100 100 100 100 2,000
timespec_get 100.110 10.999 100 100 100 100 1,200
GetSystemTimeAsFileTime 996.942 10.258 836 997 997 997 1,158

単位:ナノ秒

ミリ秒タイマ

milisec.png

基本統計量(10,000サンプル)

mean std min 25% 50% 75% max
clock 1.000 0.000 1 1 1 1 1
GetTickCount 15.625 0.484 15 15 16 16 16
GetTickCount64 15.625 0.484 15 15 16 16 16
timeGetTime 1.000 0.014 1 1 1 1 2

単位:ミリ秒

timeGetTimeはtimeBeginPeriod(1)を使用

clockはCPU時間である.

秒タイマ

second.png

基本統計量(200サンプル)

mean std min 25% 50% 75% max
time 1.000 0.000 1 1 1 1 1

単位:秒

Mac

Macのタイマは分解能のバラつきが多くて不安定なタイマが多い印象であった.

  • 開発環境:
    • Xcode 13.2.1
  • PCスペック:
    • OS:macOS Montery(Mac mini(M1 2020))
    • CPU:Apple M1
    • メインメモリ:16GB

ナノ秒タイマ

nano.png

基本統計量(10,000サンプル)

mean std min 25% 50% 75% max
chrono::system_clock 1,004.900 204.157 1,000 1,000 1,000 1,000 12,000
chrono::steady_clock 44.395 10.538 41 41 42 42 167
clock_gettime(CLOCK_REALTIME) 1,000.000 0.000 1,000 1,000 1,000 1,000 1,000
clock_gettime(CLOCK_MONOTONIC) 1,000.300 29.999 1,000 1,000 1,000 1,000 4,000
clock_gettime(CLOCK_MONOTONIC_RAW) 41.728 2.581 41 41 42 42 167
clock_gettime(CLOCK_MONOTONIC_RAW_APPROX) 100,029.387 328,585.735 42 4,375 11,770 31,875 1,992,792
clock_gettime(CLOCK_UPTIME_RAW) 41.752 2.833 41 41 42 42 209
clock_gettime(CLOCK_UPTIME_RAW_APPROX) 248,853.979 549,319.202 417 6,791 21,125 71,135 1,995,833
clock_gettime(CLOCK_PROCESS_CPUTIME_ID) 1,066.000 248.294 1,000 1,000 1,000 1,000 2,000
clock_gettime(CLOCK_THREAD_CPUTIME_ID) 140.300 20.182 83 125 125 166 209
timespec_get 1,000.000 0.000 1,000 1,000 1,000 1,000 1,000

単位:ナノ秒

clock_gettime(CLOCK_PROCESS_CPUTIME_ID), clock_gettime(CLOCK_THREAD_CPUTIME_ID)はCPU時間である.

マイクロ秒タイマ

micro.png

基本統計量(10,000サンプル)

mean std min 25% 50% 75% max
clock 1.067 0.453 1 1 1 1 39
gettimeofday 1.000 0.030 1 1 1 1 4

単位:マイクロ秒

clockはCPU時間である.

秒タイマ

second.png

基本統計量(200サンプル)

mean std min 25% 50% 75% max
time 1.000 0.000 1 1 1 1 1

単位:秒

参考資料

  1. cpprefjp - C++日本語リファレンス, https://cpprefjp.github.io
  2. Optimized C++ ―最適化、高速化のためのプログラミングテクニック, Kurt Guntheroth (著), 島 敏博 (監修), 黒川 利明 (翻訳), オライリージャパン, 2017年2月.
  3. 性能評価プログラム, https://github.com/Ocean00000/TimeEvaluation
  4. 碧色工房, https://www.mm2d.net/main/
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1