概要
プログラミング言語には,実行時間を測定するために複数のタイマを提供していることがある.
それぞれのタイマには性能が異なっていることがある.そのため,タイマの性能を知っていないと正確に実行時間の測定が行えない.
そこで,タイマの分解能とレイテンシーの測定をプログラムで行う方法を解説する.これによって,分解能とレイテンシーの測定方法を知ることで独自でタイマの性能を調べられる.
分解能
タイマが測定可能な時間粒度を指す.
レイテンシー
タイマの測定遅延時間を指す.
測定方法
タイマの分解能とレイテンシーの測定方法は参考資料[1]の3章に記載されている方法を解説する.
以降で紹介するプログラムは参考資料[1]とは多少異なっている箇所がある.
インタープリタ系言語では,参考文献[1]の方法を用いて分解能とレイテンシーを測定するのは難しいかもしれない.
分解能
タイマを連続実行してタイマのカウンタが変化したタイミングを捕捉する.その変化値を分解能として算出する.
参考資料[1]では,タイマのカウントが変化したタイミングを複数回捕捉する.そして,その変化値の平均値を分解能としている.
プログラム例
以下に,分解能測定の実装を記載したプログラム例を示す.
/**
* @fn
* 分解能測定
* @brief タイマの平均分解能を測定する.
* @param count タイマ捕捉回数
* @return 平均分解能
* @detail タイマを複数回実行して,タイマのカウントが変化したタイミングを捕捉する.
* それを引数で指定したタイマ捕捉回数分行う.
* そして,その変化値の平均値を分解能として算出する.
*/
double get_resolution(const size_t count) {
long long sum = 0;
for (auto last = time(), size_t index = 0; index < count; last = time()) {
const auto next = time();
if(last != next){
++index;
sum += next - last;
}
}
return static_cast<double>(sum) / count;
}
time()
分解能測定対象のタイマ関数
for文を用いて測定を行っているので多少の誤差が発生していることがある.
使用方法
get_resolutionに分解能捕捉回数を引数に指定して分解能の平均値を取得する.
# タイマの分解能を取得
const auto resolution = get_resolution(1000);
タイマがサポートしている時間単位によっては実行に時間がかかることあるので分解能捕捉回数を調整する必要がある.
例えば,秒単位タイマでは捕捉回数を1,000回に設定すると計測に約17分以上かかる.
レイテンシー
タイマのを複数回実行したときの合計実行時間を計測する。そして,その合計実行時間を基に算出した平均値をレイテンシーとする.
プログラム例
以下に,レイテンシー測定の実装を記載したプログラム例を示す.
/**
* @fn
* レイテンシー測定
* @brief タイマのレイテンシーを測定を測定する.
* @param count タイマ関数実行回数
* @return 平均レイテンシー(タイマ平均実行時間)
* @detail 引数で指定された回数分タイマを実行した合計実行時間を測定する。
* そして,その合計実行時間を基に算出した平均値をレイテンシーとして算出する.
*/
double get_latency(const size_t count) {
const auto start = time();
for (int index = 0; index < count; ++index) {
time();
}
const auto stop = time();
return static_cast<double>(stop - start) / (count + 1);
}
time()
レイテンシー測定対象のタイマ関数
count + 1で割っているのはタイマの測定開始(start)とタイマの測定終了(stop)の分も考慮して+1している.
for文を用いて測定を行っているので多少の誤差が発生していることがある.
使用方法
get_latencyにタイマ実行回数を引数に指定してレイテンシーを取得する.
# タイマのレイテンシーを取得
const auto latency = get_latency(1000000000);
タイマが補足できる実行時間単位になるように実行回数を調整する必要がある.
例えば,秒単位タイマでは,ナノ秒単位でのレイテンシー測定を考慮すると合計実行時間が秒になるように1,000,000,000回以上に調整すると望ましい.
参考資料
- Optimized C++ ―最適化、高速化のためのプログラミングテクニック, Kurt Guntheroth (著), 島 敏博 (監修), 黒川 利明 (翻訳), オライリージャパン, 2017年2月.
- 性能評価プログラム, https://github.com/Ocean00000/TimeEvaluation