C言語での簡単な例
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2018/10/23 06:34 UTC 版)
あるプログラムの手続きで、データの集合体から100個の要素を削除(delete)する必要があるとする。このため、for ループ内で関数 delete(要素の番号) を呼び出す。この部分を最適化する場合、ループに必要なオーバヘッドがリソースを多大に消費しているなら、ループ展開で性能が向上する。 通常のループループ展開後 int x; for (x = 0; x < 100; x++) { delete(x); } int x; for (x = 0; x < 100; x+=5) { delete(x); delete(x+1); delete(x+2); delete(x+3); delete(x+4); } この修正の結果、新たなプログラムのループ回数は 100 回から 20 回に削減される。ジャンプ命令と条件付分岐命令の実行回数は5分の1となり、ループそのものの処理にかかる時間は大幅に削減される可能性がある。その効果を最大にするため、展開されたコードではポインタ計算をしないようにすることが重要である。そのため通常はインデックスによる参照からベースとオフセットによる参照に転換する必要がある。 一方、ループ展開によってコードサイズは 3 行から 7 行に増え、コンパイラは展開された部分で必要となる変数を格納するレジスタをさらに必要とすることになる可能性がある。加えて、展開前と展開後で処理結果が同じになるように、ループ変数のループ内での操作は注意深く行わなければならない。例えば、上の例で 6 回ぶんのループを展開した場合、100 は 6 で割り切れないため、展開前と同じ結果を得るには細工が必要となる。また、ループの終了条件が変数だった場合にはさらに問題は複雑化する。Duff's device を参照されたい。
※この「C言語での簡単な例」の解説は、「ループ展開」の解説の一部です。
「C言語での簡単な例」を含む「ループ展開」の記事については、「ループ展開」の概要を参照ください。
- C言語での簡単な例のページへのリンク