![見出し画像](https://assets.st-note.com/production/uploads/images/74408023/rectangle_large_type_2_aae844184d03b158a122e13b88dd318e.png?width=1200)
高精度(高解像度)な時刻の取得 (Linux, x64, C言語) 2
高解像度の時刻取得方法として、clock_gettime()やRDTSC命令があります.
どの程度細かく時刻を取得できるか調査しました.
概要
clock_gettime()やRDTSC命令で細かい(解像度の高い)時刻を取得できます.
これらでどの程度 細かく時刻を取得できるか調査しました.
結果,clock_gettime()は約40ナノ秒,RDTS命令は約12ナノ秒に1回時刻取得をできました.
RDTS命令を使った方が良さそうです.
高精度(高解像度)な時刻の取得方法
clock_gettime() と RDTSC命令 を用います.
高精度(高解像度)な時刻の取得 (Linux, x64, C言語) 1を読んでください.
趣旨
clock_gettime() の解像度は1ナノ秒,RDTSC命令の解像度は1クロックです.
1クロックは,ベースクロックレートが3.3 GHzのCPUの場合は約0.3ナノ秒です.
ただし,clock_getime()関数の呼び出しやRDTSC命令の実行を,1ナノ秒(約3クロック)や1クロックで実行できるわけではないので,「1ナノ秒に1回時刻取得できるか?」と言われると,答えはNOです.
では,何ナノ秒に1回時刻取得できるのかを調べましょう.
測定方法
clock_gettime() と RDTSC命令 を連続して100001回行い,時刻取得間隔を計測しました.
調査環境は 記事の末尾
測定結果
時刻取得間隔は以下の通りです.
clock_gettime():
平均 39.61 [ns]
標準偏差(*1) 102.7 [ns]
RDTSC命令:
平均 11.53 [ns]
標準偏差(*1) 76.7 [ns]
評価
RDTSC命令を使うのが良いですね.関数呼び出しのオーバーヘッドもないです.
clock_gettime()はシステムコールなのでいったんカーネルモードに移行します.
調査環境
CPU: Intel Core i7-3770 CPU @ 3.40GHz. clock rate 3.4 GHz (fixed)
OS: Ubuntu 20.04.3 LTS, desktop, Linux 5.15.25
Memory: 16 GB
さらなる発展に向けて
CPUクロックレートを下げて測ったらどうなるかも調べてみたいです.
注
(*1) 正しくは「標準偏差」でなく「不偏分散の平方根」です.詳細はこちら
この記事が気に入ったらサポートをしてみませんか?