平成27年度秋期 応用情報技術者試験 午前 問19
目的プログラムの実行時間を短くするためにコンパイラが行う最適化の方法として,適切なものはどれか。
- ア 繰返し回数が多いループは,繰返し回数がより少ないループを複数回繰り返すように変形する。例えば,10,000回実行するループは,100回実行するループを100回繰り返すようにする。
- イ 算術式の中で,加算でも乗算でも同じ結果が得られる演算は乗算で行うように変更する。例えば,“X+X”は“X*2”で置き換える。
- ウ 定数が格納される変数を追跡し,途中で値が変更されないことが確認できれば,その変数を定数で置き換える。
- エ プログラム中の2か所以上で同じ処理を行っている場合は,それらをサブルーチン化し,元のプログラムのそれらの部分をサブルーチン呼出しで置き換える。
解答・解説を見る
正解:ウ
AI解説
正解はウ。定数が入ったまま変更されない変数を定数そのものに置き換える最適化は「定数伝播(定数畳込み)」と呼ばれ,実行時のメモリ参照や計算を減らして実行時間を短縮できる。実行時間短縮の最適化かどうかは「実行時の命令実行回数・メモリアクセスが減るか」で判断するのがポイントである。 ア: ループを分割して二重ループにする変形で,ループ制御のオーバーヘッドがむしろ増える。実行時間短縮には,逆にループ本体を展開して繰返し回数を減らすループアンローリングが用いられる。 イ: 一般に乗算は加算より処理時間が長い。最適化では逆に,乗算を加算やシフト演算に置き換える「演算強度の低減(strength reduction)」を行う。 ウ: 正しい。値が変わらない変数を定数で置き換える定数伝播であり,変数参照が不要になり,さらに定数式の畳込みも可能になって実行が速くなる。 エ: 共通処理のサブルーチン化はプログラムサイズの削減や保守性向上には有効だが,呼出し・復帰のオーバーヘッドが加わるため実行時間はむしろ増える。高速化では逆にインライン展開を行う。 💡 「実行時間の短縮」ならインライン展開・ループアンローリング・定数伝播,「サイズ削減」ならサブルーチン化,と目的別に整理して覚える。選択肢が最適化の“逆操作”になっているひっかけが定番である。
※Web掲載用に表記を一部変更しています。著作権はIPAに帰属します。