# 性能を意識した設計
## 定義
性能を意識した設計とは、性能要件が厳しいシステムに対して、複雑性を持ち込む性能最適化には慎重でありながらも、単純な設計を出発点として高い性能を達成するための考え方である。性能最適化と単純性はしばしば対立するものと見なされがちだが、Ousterhout はむしろ両者が両立することが多いと主張する。単純なコードは無駄な処理や冗長な処理をしないため、そのまま高速に動くことが多く、逆に性能を高めようとする再設計がクリティカルパスに絞られる限り、結果として設計が単純になることさえある。ただしこれは無条件の主張ではない。一般論としては複雑性を持ち込む最適化には慎重であるべきで、両立が成り立つのは、あくまで「クリティカルパスに絞った根本的な再設計」という限定された状況においてである。(Source: [[@2018__YaknyamPress__A Philosophy of Software Design - Chapter 20 Designing for Performance]] §20.1, §20.5)
この考え方は3段階の規律から成る。第一に、日常の設計判断では基本的な操作(ネットワーク通信・二次記憶I/O・動的メモリ割り当て・キャッシュミス)のコストに関する常識を身につけ、性能を完全に無視する("死の千の切り傷")のでも、あらゆる文を最適化しようとするのでもない中間の姿勢を取る。多くの場合、同程度に単純な選択肢の中でより高速なもの(例: ハッシュテーブル)を選ぶだけで十分である。第二に、それでも性能問題が生じた場合は、直感で手を加える前に必ず既存の挙動を計測し、ボトルネックを特定してから変更し、変更後も再計測して効果を確認する。第三に、根本的な修正(アルゴリズムの変更やキャッシュの導入など)が見当たらない場合の最後の手段として、既存のコード構造を無視した「理想のコード」を想定し、クリティカルパスに特殊ケースの判定を単一の条件式へ集約するようクラスを再設計する。(Source: [[@2018__YaknyamPress__A Philosophy of Software Design - Chapter 20 Designing for Performance]] §20.1–§20.3)
この方法論の実例として、RAMCloud の `Buffer` クラスの再設計が挙げられる。クリティカルパス(内部チャンクへの領域確保)を3層のメソッド呼び出しと6箇所の条件分岐から、単一メソッド・単一条件へと再構成した結果、速度は約2倍(1バイト文字列の追加が8.8 nsから4.75 nsへ)になり、かつコード行数は20%減少した(1886行から1476行へ)。性能最適化がコードを削減した、という結果そのものが、本節で述べた「単純性と性能の両立」を裏づける具体例である。(Source: [[@2018__YaknyamPress__A Philosophy of Software Design - Chapter 20 Designing for Performance]] §20.4–§20.5)
## 横断的知見
(現時点では本書第20章のみを出典とする。複数ソースを突き合わせた横断的な観察は、他の性能関連ソースの取り込み時に追記する。)
## 未解決の問い
- 「深いモジュールは浅いモジュールより効率的」という主張(§20.1)は、[[深いモジュール]]の一般的な定義(モジュールの機能量とインターフェースの複雑さの比)とどのように定量的に結びつくか。
- 「理想のコード」を想定してクリティカルパスを再設計する手順は、情報隠蔽・一貫性など本書の他の設計原則(例: [[深いモジュール]])とどのように優先順位付けされるべきか。衝突した場合にどちらを優先すべきかは本章では明示されていない。
- RAMCloud Buffer の事例(2倍高速化・20%のコード削減)は、クリティカルパス中心の再設計が単純性と性能を両立させた1つの実例だが、この効果はどの程度一般化できるか。[[パフォーマンスエンジニアリング]]で扱われる計測駆動のプロセス(USEメソッド・REDメソッドなど)と組み合わせたとき、同様の両立がどのくらいの頻度で成立するかは未検証である。
## 関連
- source: [[@2018__YaknyamPress__A Philosophy of Software Design - Chapter 20 Designing for Performance]]
- entity: [[RAMCloud]] / [[John Ousterhout]]
- concept: [[パフォーマンスエンジニアリング]] / [[深いモジュール]] / [[性能測定]]
## 出典
- John Ousterhout, *A Philosophy of Software Design*, Yaknyam Press, 2018, Chapter 20.