勉強会レポート: コードコンプリート
アリエルネットワークでは、毎週土曜日に自由参加の勉強会を行っています。 今回は2003年9月13日に行われた、「コードコンプリート」(アスキー)の勉強会についてレポートします。
「コードコンプリート」のセッションは、「28章 コードチューニングの戦略」と「29章 コードチューニングテクニック」を講師役が読み上げ、その内容について議論を行うという形で進行しました。
「28章 コードチューニングの戦略」では、以下のような議論が行われました。
・ボトルネックを見つけるためにプロファイラを使うとあるが、プロファイラが有用なデータを出力することは少ないのではないか。マルチスレッドのネットワークプログラム(AirOneのような)では、役に立った試しがない。プロファイラの使い方が下手なだけなのだろうか。
・AirOneの場合、ボトルネックはネットワークにあるのではないか。
・一般的な非効率の原因に、I/Oや書式付きの出力関数(printf()等)、浮動小数点演算、ページングが挙げられているが、メモリアクセスがない。現代の環境ではメモリアクセスを減らすことも高速化の重要なテクニックのはず。
「29章 コードチューニングテクニック」では、以下のような議論が行われました。
・ループを展開することで高速化を図る手法が紹介されているが、メンテナンス性に問題がある。また、キャッシュのヒット率が下がる可能性もあるため、必ずしも高速化に寄与しないのではないか。
・ネストしたループがある場合、ループ回数の多いループを内側に置くことで終了判定の回数を減らすという手法は、最適化の副作用なしで行え素晴らしい。ただ、現実のコードで終了判定が処理時間に占める割合はわずかなものなので、実際の効果は薄いのではないか。
・演算結果をテーブルに入れて参照することによって高速化するという手法は、「コードコンプリート」が書かれた1993年当時と比較して、現在ではCPUとメモリの速度差が広がっているため、必ずしも有効ではないのではないか(むしろ遅くなることもあるだろう)。
・強度リダクション(高価な演算を安価な演算で置き換える手法)の例に挙げられている、乗算を加算に置き換えて高速化する手法について、乗算と加算の速度差は小さくなっているのだから、使って速くなる場面は少ないのではないか。
・アセンブラでコーディングし直すのは最後の手段であり、安易に行うべきではない。