AP試験学習記録27年秋 午前19
目的プログラムの実行時間を短くするためにコンパイラが行う最適化方法として,適切なものはどれか。
1、コンパイラは、
ソースコードを翻訳して、機械語の目的プログラム(実行ファイル/ロードモジュール)を生成する言語プロセッサです。
実行ファイルを生成する前のソースコードを機械語に翻訳する過程において、ソースコードの解析が行われ、効率的、かつ、実行時間やメモリ使用量などを最少化するようにソースコードを調整する最適化処理が行われます。
2、最適化方法
<ループ展開:繰り返しループが一つループに置き換え>
・繰返し回数の多いループは,繰返し回数がより少ないループを複数回繰り返すように変形する。例えば,10,000回実行するループは,100回実行するループを100回繰り返すようにする。
→×。繰返し回数の多いループに対しては、ループの中身のコードを複数回配置してループ条件のチェック回数を減らしたり、分岐回数を減らすことによってオーバーヘッドを低減させる「ループ展開」と呼ばれる最適化が行われます。
※一つのループが繰り返しループより、チェック開始、分岐回数が低減できる。
<演算子強度低減:乗算から加算に置き換え>
・算術式の中で,加算でも乗算でも同じ結果が得られる演算は乗算で行うように変更する。例えば,"X+X"は"2*X"で置き換える。
→×。CPUでは乗算よりも加算の方が高速に計算できます。実際には"2*X"→"X+X"というように乗算を加算に置き換える「演算子強度低減」と呼ばれる最適化が行われます。
※加算が乗算より高速計算できる。
<定数畳み込み or 定数伝播:変更されない変数が定数に置き換え>
・定数が格納される変数を追跡し,途中で値が変更されないことが確認できれば,その変数を定数で置き換える。
→○。「定数畳み込み」及び「定数伝播」と呼ばれる最適化手法です。変数はメモリ上に動的に確保されますが、定数はプログラムコード上に埋め込まれるという違いがあるため、定数は変数よりも高速にアクセスできます。
※定数がメモリに入れる必要ない、変数より高速にアクセスできる。
<インライン展開:サーブルーチンがマインPGMに展開>
・プログラム中の2か所以上で同じ処理を行っている場合は,それらをサブルーチン化し,元のプログラムのそれらの部分をサブルーチン呼出しで置き換える。
→×。サブルーチンの呼び出しには余計なオーバーヘッドが生じます。このため、プログラムの実行に支障がない場合には、サブルーチンをメインプログラム中に展開してしまうことでオーバーヘッドを減らす「インライン展開」と呼ばれる最適化が行われます。
※サーブルーチンがオーバーヘッダがあり、メインPGMに展開すると、オーバーヘッダを避けられる。