LoginSignup
2
0

More than 1 year has passed since last update.

タイマ性能評価(C++)

Last updated at Posted at 2022-01-30

概要

タイマとは,プログラム上で時間を測定するための機能である.主に,プログラム内部の処理時間を測定するときに使用される.

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++)の記事で記載している。

参考資料

  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
0
2

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
0