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

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

C++では11種類以上のタイマが提供されており，それぞれのタイマは性能が異なっている．
そこで，それぞれのタイマの性能を知るためにタイマ性能評価を行った．
性能評価では，タイマの評価指標である分解能とレイテンシーを測定してみた．

:::note info
**分解能**
タイマが測定可能な時間粒度を指す．
:::
:::note info
**レイテンシー**
タイマの測定遅延時間を指す．
:::

基本的には，分解能とレイテンシーが低いほどタイマの性能が良いことになる．

# 測定
C++で提供されている代表的なタイマに対して分解能とレイテンシーを測定した．

:::note info
分解能とレイテンシーの測定方法は参考資料[2]の3章に記載されている方法を参考にした．
:::

**使用プログラム**


https://github.com/Ocean00000/TimeEvaluation


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

https://qiita.com/Ocean0000/items/19d9a81a2af12fe890e0

## 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<br>ナノ秒|17.796<br>ナノ秒
chrono::steady_clock|ナノ秒|100.000<br>ナノ秒|12.929<br>ナノ秒|chrono::high_resolution_clockと同じ
GetSystemTimePreciseAsFileTime|100ナノ秒|100.000<br>ナノ秒|16.459<br>ナノ秒
QueryPerformanceCounter|ナノ秒|100.000<br>ナノ秒|11.997<br>ナノ秒
timespec_get|ナノ秒|100.000<br>ナノ秒|25.699<br>ナノ秒
GetSystemTimeAsFileTime|100ナノ秒|996.977<br>マイクロ秒|1.556<br>ナノ秒
clock|ミリ秒|1.001<br>ミリ秒|33.060<br>ナノ秒
GetTickCount|ミリ秒|15.624<br>ミリ秒|1.560<br>ナノ秒
GetTickCount64|ミリ秒|15.640<br>ミリ秒|1.260<br>ナノ秒
timeGetTime|ミリ秒|1.003<br>ミリ秒|9.420<br>ナノ秒| timeBeginPeriod(1)を使用
time|秒|1.000<br>秒|3.200<br>ナノ秒|

:::note alert
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<br>マイクロ秒|12.101<br>ナノ秒
chrono::steady_clock|ナノ秒|41.840<br>ナノ秒|17.675<br>ナノ秒|chrono::high_resolution_clockと同じ
clock_gettime<br>(CLOCK_REALTIME)|ナノ秒|1.000<br>マイクロ秒|13.218<br>ナノ秒
clock_gettime<br>(CLOCK_MONOTONIC)|ナノ秒|1.000<br>マイクロ秒|18.246<br>ナノ秒
clock_gettime<br>(CLOCK_MONOTONIC_RAW)|ナノ秒|45.540<br>ナノ秒|15.546<br>ナノ秒
clock_gettime<br>(CLOCK_MONOTONIC_RAW_APPROX)|ナノ秒|417.590<br>マイクロ秒|7.194<br>ナノ秒|分解能が安定しない
clock_gettime<br>(CLOCK_UPTIME_RAW)|ナノ秒|41.730<br>ナノ秒|13.759<br>ナノ秒
clock_gettime<br>(CLOCK_UPTIME_RAW_APPROX)|ナノ秒|318.233<br>マイクロ秒|6.291<br>ナノ秒|分解能が安定しない
clock_gettime<br>(CLOCK_PROCESS_CPUTIME_ID)|ナノ秒|1.066<br>マイクロ秒|244.614<br>ナノ秒
clock_gettime<br>(CLOCK_THREAD_CPUTIME_ID)|ナノ秒|141.484<br>ナノ秒|137.898<br>ナノ秒
timespec_get|ナノ秒|1.000<br>マイクロ秒|13.120<br>ナノ秒
clock|マイクロ秒|1.056<br>マイクロ秒|238.955<br>ナノ秒
gettimeofday|マイクロ秒|1.000<br>マイクロ秒|10.090<br>ナノ秒
time|秒|1.000<br>秒|19.400<br>ナノ秒|

:::note alert
clock, clock_gettime(CLOCK_PROCESS_CPUTIME_ID), clock_gettime(CLOCK_THREAD_CPUTIME_ID)はCPU時間である．
:::

:::note warn
clock_gettime(CLOCK_MONOTONIC_RAW_APPROX)とclock_gettime(CLOCK_MONOTONIC_RAW_APPROX)は分解能が100〜500マイクロ秒でブレることがあるので安定していない．
:::

バラツキ度合いはタイマ分解能精度評価(C++)の記事で記載している。

https://qiita.com/Ocean0000/items/6e807ce917e4a37bc704

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