概要
タイマとは,プログラム上で時間を測定するための機能である.主に,プログラム内部の処理時間を測定するときに使用される.
C++では11種類以上のタイマが提供されており,それぞれのタイマは性能が異なっている.
そこで,それぞれのタイマの性能を知るためにタイマ性能評価を行った.
性能評価では,タイマの評価指標である分解能とレイテンシーを測定してみた.
分解能
タイマが測定可能な時間粒度を指す.
レイテンシー
タイマの測定遅延時間を指す.
基本的には,分解能とレイテンシーが低いほどタイマの性能が良いことになる.
測定
C++で提供されている代表的なタイマに対して分解能とレイテンシーを測定した.
分解能とレイテンシーの測定方法は参考資料[2]の3章に記載されている方法を参考にした.
使用プログラム
分解能とレイテンシーの測定方法
Windows
WindowsのVisual Studio 2020 communityを用いて11種類のタイマに対して性能評価を行った.
- 開発環境:
- Visual Studio 2022 community
- PCスペック:
- OS:Windows10 Pro(64bit)
- CPU:Intel(R)Core(TM) i9-109000X 3.70Ghz(物理コア数:10, 論理コア数:20)
- メインメモリ:128GB
タイマ | 単位 | 分解能 | レイテンシー | 備考 |
---|---|---|---|---|
chrono::system_clock | ナノ秒 | 105.350 ナノ秒 |
17.796 ナノ秒 |
|
chrono::steady_clock | ナノ秒 | 100.000 ナノ秒 |
12.929 ナノ秒 |
chrono::high_resolution_clockと同じ |
GetSystemTimePreciseAsFileTime | 100ナノ秒 | 100.000 ナノ秒 |
16.459 ナノ秒 |
|
QueryPerformanceCounter | ナノ秒 | 100.000 ナノ秒 |
11.997 ナノ秒 |
|
timespec_get | ナノ秒 | 100.000 ナノ秒 |
25.699 ナノ秒 |
|
GetSystemTimeAsFileTime | 100ナノ秒 | 996.977 マイクロ秒 |
1.556 ナノ秒 |
|
clock | ミリ秒 | 1.001 ミリ秒 |
33.060 ナノ秒 |
|
GetTickCount | ミリ秒 | 15.624 ミリ秒 |
1.560 ナノ秒 |
|
GetTickCount64 | ミリ秒 | 15.640 ミリ秒 |
1.260 ナノ秒 |
|
timeGetTime | ミリ秒 | 1.003 ミリ秒 |
9.420 ナノ秒 |
timeBeginPeriod(1)を使用 |
time | 秒 | 1.000 秒 |
3.200 ナノ秒 |
clockはCPU時間である.
Mac
MacのXcodeを用いて11種類のタイマに対して性能評価を行った.
- 開発環境:
- Xcode 13.2.1
- PCスペック:
- OS:macOS Montery(Mac mini(M1 2020))
- CPU:Apple M1
- メインメモリ:16GB
タイマ | 単位 | 分解能 | レイテンシー | 備考 |
---|---|---|---|---|
chrono::system_clock | ナノ秒 | 1.001 マイクロ秒 |
12.101 ナノ秒 |
|
chrono::steady_clock | ナノ秒 | 41.840 ナノ秒 |
17.675 ナノ秒 |
chrono::high_resolution_clockと同じ |
clock_gettime (CLOCK_REALTIME) |
ナノ秒 | 1.000 マイクロ秒 |
13.218 ナノ秒 |
|
clock_gettime (CLOCK_MONOTONIC) |
ナノ秒 | 1.000 マイクロ秒 |
18.246 ナノ秒 |
|
clock_gettime (CLOCK_MONOTONIC_RAW) |
ナノ秒 | 45.540 ナノ秒 |
15.546 ナノ秒 |
|
clock_gettime (CLOCK_MONOTONIC_RAW_APPROX) |
ナノ秒 | 417.590 マイクロ秒 |
7.194 ナノ秒 |
分解能が安定しない |
clock_gettime (CLOCK_UPTIME_RAW) |
ナノ秒 | 41.730 ナノ秒 |
13.759 ナノ秒 |
|
clock_gettime (CLOCK_UPTIME_RAW_APPROX) |
ナノ秒 | 318.233 マイクロ秒 |
6.291 ナノ秒 |
分解能が安定しない |
clock_gettime (CLOCK_PROCESS_CPUTIME_ID) |
ナノ秒 | 1.066 マイクロ秒 |
244.614 ナノ秒 |
|
clock_gettime (CLOCK_THREAD_CPUTIME_ID) |
ナノ秒 | 141.484 ナノ秒 |
137.898 ナノ秒 |
|
timespec_get | ナノ秒 | 1.000 マイクロ秒 |
13.120 ナノ秒 |
|
clock | マイクロ秒 | 1.056 マイクロ秒 |
238.955 ナノ秒 |
|
gettimeofday | マイクロ秒 | 1.000 マイクロ秒 |
10.090 ナノ秒 |
|
time | 秒 | 1.000 秒 |
19.400 ナノ秒 |
clock, clock_gettime(CLOCK_PROCESS_CPUTIME_ID), clock_gettime(CLOCK_THREAD_CPUTIME_ID)はCPU時間である.
clock_gettime(CLOCK_MONOTONIC_RAW_APPROX)とclock_gettime(CLOCK_MONOTONIC_RAW_APPROX)は分解能が100〜500マイクロ秒でブレることがあるので安定していない.
バラツキ度合いはタイマ分解能精度評価(C++)の記事で記載している。
参考資料
- cpprefjp - C++日本語リファレンス, https://cpprefjp.github.io
- Optimized C++ ―最適化、高速化のためのプログラミングテクニック, Kurt Guntheroth (著), 島 敏博 (監修), 黒川 利明 (翻訳), オライリージャパン, 2017年2月.
- 性能評価プログラム, https://github.com/Ocean00000/TimeEvaluation
- 碧色工房, https://www.mm2d.net/main/