この付録では、SPARC プラットフォームでのパフォーマンスチューニングについて説明します。
処理速度を最適化すると、ほとんどのアプリケーションのパフォーマンスも向上します。しかし C ライブラリの中には、処理速度を最適化することができないものがあります。次にその例を挙げます。
整数算術ルーチン - 現在の SPARC V8 プロセッサでは、整数の乗算や除算の命令をサポートしています。しかし標準の C ライブラリルーチンがそれらの命令を使用すると、プログラムが SPARC V7 プロセッサ上で実行されている場合、カーネルエミュレーションの負荷のために処理速度が遅くなるか、また最悪の場合にはまったく実行できないことも予想されます。したがって、整数の乗算や除算の命令は標準の C ライブラリルーチンでは使用できません。
ダブルワードのメモリーアクセス - SPARC のダブルワードのロード命令やストア命令 (ldd および std) を使用すると、memmove() や bcopy() といったブロックのコピーや移動のルーチンの処理速度を飛躍的に上げることができます。しかし memmove() や bcopy() は、フレームバッファーのような 64 ビットアクセスをサポートしていないメモリーにマップされたデバイスには適していません。したがって、ldd や std は標準 C ライブラリルーチンでは使用できません。
メモリー割り当てアルゴリズム - C ライブラリルーチンの malloc() と free() は、処理速度や使用領域、およびコーディング時のエラーの起こしやすさなどを考慮した結果の妥協案として UNIX で実装されたものです。協調システム (buddy system) アルゴリズムに基づくメモリーアロケータは、標準ライブラリより処理速度が速いものがほとんどですが、そのかわりに使用する領域も増えてしまいがちです。
ライブラリ libfast.a は標準 C ライブラリ機能バージョンの処理速度を上げたものです。これはオプションであるため、標準 C ライブラリでは使用できないようなアルゴリズムやデータ表現を使用することができ、ほとんどのアプリケーションのパフォーマンスを改善することができます。
次のチェックリストを参考にして、自分のアプリケーションのパフォーマンスが libfast.a によって向上するかどうかを判断してください。その際、プロファイリングを使用します。
libfast.a を使用する場合。アプリケーションの 1 つのバイナリを SPARC V7 と V8 の両方のプラットフォームで実行しなければならないのに整数の乗算や除算の性能が重要である場合。重要なルーチン: .mul、.div、.rem、.umul、.udiv、.urem
メモリー割り当てのパフォーマンスが重要で、通常もっとも多く割り当てられるメモリーのサイズが 2 の階乗に近い場合。重要なルーチン: malloc()、free()、realloc()
ブロックの移動またはフィルのルーチンのパフォーマンスが重要である場合。重要なルーチン: bcopy()、bzero()、memcpy()、memmove()、memset()
libfast.a を使用してはいけない場合 - アプリケーションが、64 ビットのメモリー操作をサポートしていない入出力デバイスへのユーザーモードのメモリーマップされたアクセスを必要とする場合。
アプリケーションがマルチスレッド対応である場合。
アプリケーションをリンクする際には、cc コマンドの後ろに -lfast オプションを加えてください。cc コマンドは標準の C ライブラリよりも先に libfast.a にあるルーチンをリンクします。