性能評価・プロファイリング

上のような小さなループで計算の速さを測ったところ、Nを大きくしても時間がほとんど0だった。最も考えられる原因はどれか。

start = now();
for (i = 0; i < N; i++)
    x = a * b + i;
end = now();
  1. ACPUが計算を一瞬で終わらせる特別な命令を持っているから
  2. Bxの値が後で使われないため、コンパイラがループの計算を不要として取り除いたから
  3. C時計の関数が壊れているから
答えと解説を見る

正解:B. xの値が後で使われないため、コンパイラがループの計算を不要として取り除いたから

最適化を有効にしたコンパイラは、結果が使われない計算を不要なコード(デッドコード)として取り除いたり、ループの結果を計算して定数に置き換えたりします。そのため、小さな部分だけを取り出したマイクロベンチマークでは、測りたい計算が実際には行われていないことがあります。結果を出力する、volatileやコンパイラの最適化を防ぐ工夫を使う、生成された機械語を確かめる、などで対策します。

  • A. そのような命令はありません。
  • B. 正しい。マイクロベンチマークのよくある落とし穴です。
  • C. 時計は正しく動いています。
この分野を解く 分野ページへ

性能評価・プロファイリングのほかの問題

  1. プログラムの実行時間を測るとき、同じ測定を何回も繰り返し、最初の数回の結果を除くことが多い理由として正しいものはどれか。
  2. 非常に短い処理の時間を、1回だけ測ろうとしたときの問題と、その対策の組み合わせとして正しいものはどれか。
  3. 実行時間の測り方のうち、「壁時計時間」と「CPU時間」の違いとして正しいものはどれか。
  4. サーバの性能を表すスループットとレイテンシの説明として正しいものはどれか。
  5. Webのサービスの応答時間を評価するとき、平均の値だけでなく99パーセンタイルの値(遅い方から1%の境目)を見ることが多い理由として正しいものはどれか。