リンカーとライブラリ

ページング回数の削減

「共有可能性の最大化」で説明したメカニズムの多くは、共有オブジェクトを使用するときに生じるページングを削減するために役立ちます。ここでは、一般的なソフトウェア性能に関する考慮事項のいくつかについてさらに説明します。

新しいページにアクセスするすべてのプロセスでページフォルトが発生します。これはコストのかかる操作であり、また共有オブジェクトは多数のプロセスで使用できるため、共有オブジェクトへのアクセスによって生成されるページフォルトの数を減らすと、プロセスおよびシステム全体の効率が改善されます。

使用頻度の高いルーチンとそのデータを隣接するページの集合として編成すると、参照の効率が良くなるため、性能は通常向上します。あるプロセスがこれらの関数の 1 つを呼び出すとき、この関数がすでにメモリー内にある場合があります。これは、この関数が、使用頻度の高い他の関数のすぐ近くに存在するためです。同様に、相互に関連する関数をグループ化すると、参照効率が向上します。たとえば、関数 foo() への呼び出しによって、常に関数 bar() が呼び出される場合は、これらの関数を同じページ上に置きます。cflow(1)tcov(1)prof(1)、および gprof(1) は、コードカバレージとプロファイリングを判定するために役立ちます。

関連する機能を各自の共有オブジェクトに分離することもお勧めします。標準 C ライブラリは従来、関連しない多数の関数を含んで構築されていて、たとえば単一の実行可能ファイルがこのライブラリ内のすべてを使用することはほとんどありません。このライブラリは広範囲に使用されるため、実際に使用頻度の最も低い関数がどれかを判定することもかなり困難です。これに対して、共有オブジェクトを最初から設計する場合は、関連する関数だけを共有オブジェクト内に保持することをお勧めします。これにより、参照効率が向上するだけでなく、オブジェクト全体のサイズを減らすという効果も得られます。