付録A 開発者へのヒント

すべての優れたプログラミング教本では、メモリ割り当ての問題と特定機能のパフォーマンスを網羅しています。ご自身のソフトウェアを開発するにあたっては、ソフトウェアが実行するシステムで電力消費が増加する可能性があることに注意してください。こうした配慮は、コードのすべてのラインに影響するものではありませんが、頻繁にパフォーマンスのボトルネックになる領域ではコードを最適化することができます。
問題なることが多い手法は以下のとおりです。
  • スレッドを使用する。
  • 不必要な CPU のウェイクアップ、およびウェイクアップを効率良く使用しない状態。ウェイクアップする必要がある場合は、すべてを一度にできるだけ迅速に実行します (すぐにアイドル状態になるように迅速にすべてを実行します) 。
  • [f]sync() を不必要に使用する。
  • 不必要なアクティブポーリング、または短い通常のタイムアウトを使用する (代わりにイベントに反応する) 。
  • ウェイクアップを効率的に使用していない。
  • 低効率なディスクアクセス。頻繁なディスクアクセスを回避するために大きなバッファを使用してください。一度に大きなブロックを書き込みます。
  • 低効率のタイマーを使用する。可能な限りアプリケーション群 (またはシステム群) にタイマーをグループ化します。
  • 過度の I/O、電力消費、またはメモリ使用 (メモリリークを含む) 。
  • 不必要に計算を実行する。
以下のセクションでは、これらの領域をさらに詳しく検証していきます。

A.1. スレッドの使用

スレッドを使用するとアプリケーションのパフォーマンスが改善し、より速くなると思われていますが、これはすべてのケースで当てはまるわけではありません。
Python

Python は Global Lock Interpreter [1] を使用するため、スレッドは大規模な I/O 運用でのみ効果的です。Unladen-swallow [2] は、コードを最適化できる可能性がある Python の高速実装です。

Perl

Perl のスレッドは、もともとはフォークがないシステム (32-bit Windows オペレーティングシステムのシステムなど) で実行するアプリケーション用に開発されました。Perl のスレッドでは、データはすべての単独スレッド用にコピー (コピーオンライト:Copy On Write) されます。ユーザーはデータ共有のレベルを定義できるため、データはデフォルトでは共有されません。データを共有するには、threads::shared モジュールを含める必要があります。しかし、データはコピー (コピーオンライト) されるだけでなく、モジュールはデータのタイ変数も作成します。これでさらに時間がかかり、遅くなります。[3]

C

C のスレッドは同じメモリを共有します。各スレッドはそれ自身のスタックを持ち、カーネルは新しいファイル記述子を作成したり、新しいメモリスペースの割り当てをする必要がありません。C はより多くのスレッドにより多くの CPU のサポートを実際に活用できます。そのため、スレッドのパフォーマンスを最大にするには、C か C++ などの低水準言語を使用すべきです。スクリプト言語を使用している場合は、C バインディングを考慮してください。プロファイラを使用すると、コードの正しく実行していない部分を特定できます。 [4]