私が Java を (たとえば C と比較して) 使用するのが好きな大きな理由の 1 つは、(コレクション API のように) 利用可能な組み込みデータ構造がたくさんあることです。しかし、これらのデータ構造の実装は最適ではありませんか? パフォーマンスを向上させるために、独自の実装を作成したほうがよいでしょうか?
3 に答える
解決すべき具体的なパフォーマンスの問題が発生するまで、Java の Collections ライブラリのクラスを再実装するのに時間を無駄にすることはありません。組み込みクラスは、何千人もの人々によってテストされています。それらは動作することが証明されており、ほとんどの一般的なユース ケースでパフォーマンスが優れています。ほとんどの場合、Collection クラスでパフォーマンスの問題を見つけたのは、データ構造の実装が間違っているのではなく、誰かが問題に対して間違ったデータ構造を選択したことが原因であることがわかりました。
組み込みの実装は非常に高速で (パフォーマンスを考慮して構築されています)、大部分のアプリケーションにとって十分な速さです。
ケースに十分な速さであるかどうかは、アプリケーションとハードウェアによって異なります。たとえば、高速な CPU を使用しているが、メモリが制限されている場合、またはその逆の場合は、大きな違いが生じる可能性があります。
非常にパフォーマンスが必要なものを開発している場合は、サポートする必要がある種類のデータ負荷と処理レベルで小さなテスト プロジェクトを作成することから始めることをお勧めします。ターゲット ハードウェア。そうでない場合は、アルゴリズムを微調整したり、より優れたハードウェアを購入したり、キャッシュを使用したり、「より金属に近い」言語に切り替えることができる場合があります。
すべてを最適化するという罠に陥らないように注意してください。通常、最適化する必要があるのは、アプリケーションのほんの一部です。
JCF の最大の強みは、必ずしもパフォーマンスではなく柔軟性です。あるコレクションから別のコレクションに簡単に変更できる優れたデザインです。それらをスレッドセーフ、不変などにするためのユーティリティクラスがあります。または、独自のカスタムコレクションを実装できます(インターフェイスを実装し、最も近い既存の実装で構成します):
public MyList<E> implements List<E> {
private List<E> holdingList = new ArrayList<E>();
@Override
public boolean add(E e) {
//your custom needs
}
//delegate non custom ones to holdingList
}
パフォーマンスの問題に本当に悩まされている場合は、おそらく古き良きアレイを使用する必要がありますが、ほとんどの場合、これは必ずしも必要ではありません。
ただし、JCF から最高のパフォーマンスを得るには、JCF の内部について少し知っておく必要があります。観点からは、大量のメモリを消費する傾向があるため、批判される可能性があります。
いくつかの基本的なこと: 使用される並べ替えは、インプレース並べ替えを並べ替えるマージ並べ替えですが、クイック並べ替えよりも少し遅いことを知っておくとよいでしょう。使用するコレクションのサイズを予測し、値としてコンストラクターに渡す必要があります。常に既定値に依存する必要はありません。もう 1 つの重要なことは、適切なコレクションを選択することです。より多くのメモリを必要とするため、リストが使用するときにマップを使用しないでください。また、メモリを消費するため、無駄な空のコレクションを保持しないようにする必要があります。コレクションとメモリ使用量に関する優れた記事は、こちら にあります。