付録A 開発者へのヒント

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

A.1. スレッドの使用

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

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

Perl

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

C

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