性能評価・プロファイリング
上のような小さなループで計算の速さを測ったところ、Nを大きくしても時間がほとんど0だった。最も考えられる原因はどれか。
start = now();
for (i = 0; i < N; i++)
x = a * b + i;
end = now();
- ACPUが計算を一瞬で終わらせる特別な命令を持っているから
- Bxの値が後で使われないため、コンパイラがループの計算を不要として取り除いたから
- C時計の関数が壊れているから
答えと解説を見る
正解:B. xの値が後で使われないため、コンパイラがループの計算を不要として取り除いたから
最適化を有効にしたコンパイラは、結果が使われない計算を不要なコード(デッドコード)として取り除いたり、ループの結果を計算して定数に置き換えたりします。そのため、小さな部分だけを取り出したマイクロベンチマークでは、測りたい計算が実際には行われていないことがあります。結果を出力する、volatileやコンパイラの最適化を防ぐ工夫を使う、生成された機械語を確かめる、などで対策します。
- A. そのような命令はありません。
- B. 正しい。マイクロベンチマークのよくある落とし穴です。
- C. 時計は正しく動いています。