平成27年度 秋期 午前 問19
ソフトウェア
コンパイラが行う最適化の方法
目的プログラムの実行時間を短くするためにコンパイラが行う最適化の方法として,適切なものはどれか。
- ア繰返し回数が多いループは,繰返し回数がより少ないループを複数回繰り返すように変形する。例えば,10,000 回実行するループは,100 回実行するループを 100 回繰り返すようにする。
- イ算術式の中で,加算でも乗算でも同じ結果が得られる演算は乗算で行うように変更する。例えば,“X+X” は “X*2” で置き換える。
- ウ定数が格納される変数を追跡し,途中で値が変更されないことが確認できれば,その変数を定数で置き換える。
- エプログラム中の 2 か所以上で同じ処理を行っている場合は,それらをサブルーチン化し,元のプログラムのそれらの部分をサブルーチン呼出しで置き換える。
答えと解説を見る
✓ これが正解ウ定数が格納される変数を追跡し,途中で値が変更されないことが確認できれば,その変数を定数で置き換える。
解説
値が変わらない変数を定数に置き換える工夫です。
コンパイラの最適化には、実行を速くする向きと、出来上がるプログラムを小さくする向きがあります。この二つはしばしば反対を向くので、設問がどちらを求めているかを先に確かめるのが要点です。ここでは実行時間を短くする方法が問われています。正解にあたる工夫は、ある変数に入る値が最後まで変わらないと確かめられたとき、その変数を値そのものに置き換えるというものです。置き換えられれば、実行のたびに変数の中身を読みに行く手間が消えます。さらに、その値を使った計算がその場で片づく場合は、翻訳の段階で答えを出してしまい、実行時には何も残らないこともあります。実行時にやることが減る、という一点で効いているわけです。残りの三つの記述は、実行時にやることが増えるか、少なくとも減りません。判断に迷ったら、書き換えた後で CPU が実際に行う仕事が増えるか減るかを数えてみると、向きがはっきりします。
ほかの選択肢はなぜ違うのか
- ア繰返し回数が多いループは,繰返し回数がよ…:繰返しを入れ子に分け直しても、回る総数はもとのままです。外側の繰返しを管理する手間が加わる分だけ、実行にかかる時間はむしろ延びます。
- イ算術式の中で,加算でも乗算でも同じ結果が…:多くの CPU では、足す演算のほうが掛ける演算より速く終わります。実際に行われている書き換えは逆向きで、掛ける形を足す形や桁をずらす形へ直します。
- エプログラム中の 2 か所以上で同じ処理を…:同じ処理をひとまとめにして呼び出す作りは、出来上がるプログラムを小さくする工夫です。呼び出すときと戻るときの手間が加わるので、速さの面ではむしろ不利になります。
出典:平成27年度 秋期 応用情報技術者試験 午前 問19
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)