
133
7
章
ホット な 文 を 最 適 化 する
アイデアはそこにあるのですよ。石の中にあるので、余計な石を取り除きさえすればいいのです。
―
ミケランジェロ(
1475-1564
)、「どのように傑作を彫り上げるのか」という問いに答えて。
文レベルの最適化は、ミケランジェロがその傑作を彫刻する方法と同様に、実行ストリームから
命令を取り除くプロセスだとモデル化できる。ミケランジェロの名言の問題点は、石のどの部分が
余分で、どの部分が傑作かを教えてくれないことだ。
文レベルでの最適化の問題点は、関数呼び出しを除けば、
C++
の文は、機械命令を数語より多
くは消費しないことだ。そのようなわずかなレベルの最適化は、開発者が文のコストを増大させる
要因を特定して最適化する価値があるだけホットだということでなければ、一般に十分な改善は得
られない。要因には次のようなものがある。
ループ
ループの中の文のコストは繰り返す回数倍になる。開発者はループを探し出さないといけない。
プロファイラは、ホットなループを含む関数を特定するが、関数のどのループがホットかまで
は教えてくれない。ループの中で呼び出されているから関数をホットだとしているが、どの呼
び出しがホットかまではわからない。プロファイラは直接ループを指し示さないので、開発者
はコードを調べて、プロファイラの出力を用いて、ホットなループを特定しなければならない。
頻繁に呼ばれる関数
関数のコストは関数が呼び出される回数だけ掛けられる。プロファイラはホットな関数を直接
示す。
プログラム全体で使われるイディオム ...