
93
5.5 最適化のパターン
5.5.2
遅延計算
遅延計算の目的は、必要になる時点の直前まで計算を遅延させることだ。遅延計算にはいくつか
の便益がある。計算が関数のすべての実行パス(
if-then-else
のすべての分岐パス)で必要とい
うわけではないとき、結果が必要なパスでのみ計算すれば済む。次のような例がある。
2
段階初期化
オブジェクトを生成するのに必要な情報が、インスタンスを静的に作れるときに得られないこ
とがある。オブジェクトを一度に生成する代わりに、コンストラクタは、空オブジェクトを作
る最低限のコードだけ含む。後になって、実行プログラムが初期化メンバ関数を呼び出して生
成を完了する。追加データが得られるまで初期化を遅延することは、生成されたオブジェクト
が効率的なフラットなデータ構造だということを意味する(「
6.7
データ構造をフラットにす
る」参照)。
場合によると、遅延計算値が計算されたかどうかをチェックするコストがかかる。このコスト
は、動的に生成されたクラスへのポインタが正当かどうかを保証するコストに匹敵する。
コピーオンライト
動的メンバ変数をオブジェクトがコピーされたときにコピーする代わりに、
2
つのインスタン
スが動的変数の単一コピーを共有する。コピーは、どちらかのインスタンスが変数を変更する
まで遅延される。
5.5.3
バッチ処理
バッチ処理の目的は、複数の作業要素をまとめて一緒に処理することにある。バッチ処理は、関
数呼び出しの繰り返しや要素を
1
つずつ処理すると生じる他の計算を取り除くことができる。すべ ...