応用情報技術者 2015年 秋期 午前2 問19
問題文
目的プログラムの実行時間を短くするためにコンパイラが行う最適化の方法として適切なものはどれか。
選択肢
ア:繰返し回数が多いループは、繰返し回数がより少ないループを複数回繰り返すように変形する。 例えば、10,000回実行するループは、100回実行するループを100回繰り返すようにする。
イ:算術式の中で、加算でも乗算でも同じ結果が得られる演算は乗算で行うように変更する。 例えば、“X+X” は “X*2” で置き換える。
ウ:定数が格納される変数を追跡し、途中で値が変更されないことが確認できれば、その変数を定数で置き換える。(正解)
エ:プログラム中の2か所以上で同じ処理を行っている場合は、それらをサブルーチン化し、元のプログラムのそれらの部分をサブルーチン呼出しで置き換える。
目的プログラムの実行時間を短くするためにコンパイラが行う最適化の方法【午前2 解説】
要点まとめ
- 結論:定数の値が途中で変わらない変数は定数に置き換えることで実行時間を短縮できる。
- 根拠:定数置換は計算の簡略化やメモリアクセス削減に繋がり、効率的なコード生成が可能になる。
- 差がつくポイント:ループの変形や演算の置換は誤った最適化になることが多く、正しい定数置換の理解が重要。
正解の理由
選択肢ウは「定数が格納される変数を追跡し、途中で値が変更されないことが確認できれば、その変数を定数で置き換える」という定数伝播(constant propagation)という代表的な最適化手法を示しています。これにより、変数参照を定数に置き換え、計算を簡略化し、実行時間を短縮できます。コンパイラの最適化として広く用いられており、正解です。
よくある誤解
ループの回数を分割する(ア)は逆にオーバーヘッドが増え、実行時間が長くなることがあります。
加算を乗算に置き換える(イ)は必ずしも高速化にならず、誤った最適化です。
加算を乗算に置き換える(イ)は必ずしも高速化にならず、誤った最適化です。
解法ステップ
- 問題文の「実行時間を短くする最適化方法」を理解する。
- 各選択肢の内容を読み、最適化の効果を考える。
- ループ変形(ア)が実行時間短縮に繋がるか検討。
- 演算の置換(イ)が正しいか評価。
- 定数置換(ウ)が代表的な最適化手法であることを確認。
- サブルーチン化(エ)が実行時間短縮に必ずしも寄与しないことを理解。
- 最も合理的な選択肢ウを選ぶ。
選択肢別の誤答解説
- ア: ループ回数を分割するとループ制御のオーバーヘッドが増え、かえって遅くなる場合が多い。
- イ: 加算を乗算に置き換えると計算コストが増えることがあり、必ずしも高速化にならない。
- ウ: 定数伝播により変数参照を定数に置き換え、計算を簡略化し実行時間を短縮できる。
- エ: サブルーチン化はコードの再利用性を高めるが、呼び出しコストが増え実行時間短縮には直結しない。
補足コラム
定数伝播はコンパイラの基本的な最適化技法の一つで、他にもループ展開やデッドコード削除などと組み合わせて使われます。最適化はプログラムの意味を変えずに効率化することが重要です。
FAQ
Q: ループの回数を分割すると必ず高速化しますか?
A: いいえ。ループ制御のオーバーヘッドが増え、逆に遅くなることがあります。
A: いいえ。ループ制御のオーバーヘッドが増え、逆に遅くなることがあります。
Q: 加算を乗算に置き換えるのはなぜ誤りですか?
A: 乗算は加算より計算コストが高い場合が多く、必ずしも高速化になりません。
A: 乗算は加算より計算コストが高い場合が多く、必ずしも高速化になりません。
関連キーワード: 定数伝播、コンパイラ最適化、実行時間短縮、ループ最適化、定数置換

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

