プログラム実行速度の改善
JDK 6の拡張機能
JDK 6での多くのパフォーマンス拡張の説明は、パフォーマンスWebサイトの「
Java SE 6 Performance Whitepaper」を参照してください。
JDK 5.0の拡張機能
次に挙げるのは、プログラム実行速度を改善するためにJDK 5.0で行われた拡張の一部です。
- ガベージ・コレクションのエルゴノミクス - クライアントまたはサーバーの実行時コンパイラを自動的に検出して選択します。これにより、サーバー・クラスのマシンでのパフォーマンスが向上します。詳細は、「Java仮想マシン」のサーバークラス・マシンの検出に関するトピックとガベージ・コレクション・エルゴノミクスに関するトピックを参照してください。
- StringBuilderクラス - 新しいクラスStringBuilderを追加しました。このクラスは、パフォーマンスを向上するため、基本的に非同期のStringBufferとして動作します。同期が必要でないかぎりは、StringBufferをすべてStringBuilderに置き換えてください(同期はほとんど必要ありません)。StringBuilderは、ほとんどの場合StringBufferよりも高速です。
- Java 2Dテクノロジ - Java 2Dのパフォーマンス拡張による副産物として、SwingやJFCなど、他の機能分野のパフォーマンスにもよい影響が及んでいます。たとえば、BufferedImageオブジェクトの高速化向上、OpenGLを使用したハードウェア高速化によるレンダリングのサポート、テキスト・レンダリングのパフォーマンス向上などが挙げられます。詳細は、「Java 2Dの新機能」を参照してください。
- Image I/O - JPEGイメージの読書き処理時のパフォーマンスおよびメモリー使用が向上しました。「Image I/Oの新機能」の「パフォーマンスの向上」を参照してください。
JDK 1.4の拡張機能
次に挙げるのは、プログラム実行速度を改善するためにJDK 1.4で行われた拡張の一部です。
- Java 2Dテクノロジ - Java 2Dのパフォーマンス拡張による副産物として、SwingやJFCなど、他の機能分野のパフォーマンスにもよい影響が及んでいます。JDK 1.4でのパフォーマンス改善の一例として、SolarisでのリモートX表示が大幅に改善されています。パフォーマンスの拡張を含む、Java 2Dの拡張機能の詳細は、「Java 2Dの新機能」を参照してください。
- java.nio - New I/O APIでは、バッファ管理、スケーラブルなネットワークとファイル入出力、文字セットのサポート、および正規表現マッチングの分野でパフォーマンスが向上しています。New I/O APIは、java.ioパッケージの入出力機能を補足するものです。詳細は、「I/O API」を参照してください。
- リフレクション - JDK 1.4.0以降では、一部のリフレクション・ベース処理、具体的にはjava.lang.reflect.Field、java.lang.reflect.Method.invoke()、java.lang.reflect.Constructor.newInstance()およびClass.newInstance()が書きなおされて、パフォーマンスが向上しました。リフレクション・ベースの呼び出しやインスタンス化は、以前のリリースに比べ数倍速くなりました。
- ネットワーク機能 - JDK 1.4のネットワーク機能では、HTTPストリーミングのパフォーマンスが改善されました。
- java.math - BigIntegerクラスに、素数を生成するための新しいstaticメソッドprobablePrimeが追加されました。従来は、BigIntegerの素数を生成する方法は1つしかなく、メソッドの呼出し側から、「確実性」(呼出し側が許容できる、結果が素数でない確率の対数)を提供する必要がありました。しかし、提供する確実性の値が不適切だと、パフォーマンスが低下したり(確実性の値が高すぎる場合)、重大なバグが発生したり(値が低すぎる場合)することがありました。この新しい素数生成メソッドは、ANSIのドラフト仕様(X9-80)に基づいて自動的に判別される適切な確実性の値を使用する、素数生成のための効率的なアルゴリズムを提供します。
- Hotspot - Java HotSpot仮想マシンでは、「フル・スピード・デバッグ」を使用するようになりました。旧バージョンのHotSpotでは、デバッグが有効にされている場合、プログラムはインタプリタのみを使用して実行していました。このバージョンでは、HotSpotテクノロジのパフォーマンス面の利点を、デバッグが有効な状態で動作しているプログラムにおいて活かすことができます。パフォーマンスが向上すると、長時間動作するプログラムをより簡単にデバッグできるようになります。また、フル・スピードでテスティングを行なったり、例外上でデバッガを起動できるようになりました。
JDK 1.3の拡張機能
次にあげるのは、プログラム実行速度および一般的な実行時パフォーマンスを改善するために、以前のリリースであるJDK 1.3で加えられた変更の一部です。これらの拡張は、JDK 1.4にも引き継がれています。
詳細は、Bug DatabaseのWebサイトにある関連するバグ・レポートのリンクを参照してください。
- readUTFおよびwriteUTFのパフォーマンスの改善 - DataInputStreamおよびDataInputStreamのreadUTFメソッドおよびwriteUTFメソッドの実装が変更され、パフォーマンスが改善されました。これは、Bug DatabaseのWebサイトにあるバグ番号4219771の修正です。
- JScrollPaneペイントのパフォーマンスの改善 - JScrollPaneの実装が改善され、ダブル・バッファリングが使用されていないときに過剰なペイントと画面のちらつきが起きないようになりました。
- JTableのパフォーマンスの改善 - JTableの列処理機能のパフォーマンスが改善されました。以前は、列の追加操作または列幅の再計算操作のパフォーマンスは、列数の増加に合わせて十分に増強されませんでした。パフォーマンスの増強を改善するために、実装が変更されました。これは、Bug DatabaseのWebサイトにあるバグ番号4223642の修正です。
- ペイントの合体 - 改善されたペイント合体アルゴリズムの実装によって、ペイントのパフォーマンスが拡張されました。再ペイントが必要な領域は、イベント・キューに送信されるときに、単一の、四角形でない再ペイント領域に合体されます。これにより、再ペイントがバッチ処理され、以前のリリースより効率的に複数の再ペイントが同時実行されます。
- フレームのサイズ変更 - トップレベル・フレームのサイズ変更が改善されました。
- フレームの内部移動 - Graphics.copyArea呼出しの使用により、SwingのDefaultDesktopManagerが再描画する量は、フレームをドラッグするときに比べて大幅に少なくなりました。
- BigIntengerのパフォーマンス向上 - Pure Javaのプログラミング言語コードにクラスjava.math.BigIntegerが実装し直されました。以前は、BigIntegerの実装はPlumb Cライブラリをベースにしていました。新しい実装により、すべての標準操作が古い実装よりずっと高速に実行されます。新しい実装では、実行する操作によっては5倍以上高速になります。
- 数値演算のパフォーマンスを向上させる機能の提供 - Java SEに、一般的な数値演算を実行するためのAPIを提供する2つのクラスが追加されました。
- java.lang.StrictMath - クラスjava.lang.StrictMathは、以前のバージョンのJavaプラットフォームのクラスjava.lang.Mathの名前が変わったものですが、ほかの点ではMathの仕様を保持しています。このクラスは、特にすべての実装でビット単位まで再現可能な結果を返すように定義されています。
- java.lang.Math - クラスjava.lang.Mathは、クラスStrictMathと同じAPIのセットを提供します。ただし、クラスStrictMathの一部の数値関数とは違って、クラスMathの等価な関数のすべての実装は、ビット単位まで同じ結果を返すようには定義されておらず、特定の制約内で結果が異なることがあります。このゆるやかさによって、厳密な再現性が要求されない実装においてパフォーマンスの向上が可能になります。