見出し画像

高精度(高解像度)な時刻の取得 (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) 正しくは「標準偏差」でなく「不偏分散の平方根」です.詳細はこちら


この記事が気に入ったらサポートをしてみませんか?