2009-03-12 5 views
5

マップは50〜200までのエントリで構成されているという要件があります(それ以上の場合もありますが、とにかくそれをあまりにも小さくしないようにしましょう)。執筆は一度だけ行われ、(Map.get( "keyName")を使って)読んだり読んだりすることができます(Webアプリケーションです)。Write-Once + Read-Numerous MapはJavaでですか?

私は現在、ハッシュマップのために(おそらく私には)最も最適なパフォーマンスを提供しています(注:要求ごとに多数の読み込み)。データ構造の人ではなく、java.lang。*やApache commonsなどのパッケージから、私の要求に最も適したMap実装を提案できますか?いずれかが、あなたはCollectons.unmodifiableMapメソッドを使用することができ読み込む前に、すべての書き込みが行われている場合

YC

答えて

7

パフォーマンスの問題が実際に発生していない限り(このコードにトレースされていない限り)、私はそれについて心配しません。

そして、私はマップを置き換える前に、なぜ正確には、Webページを生成するために4000回の検索(200回の読み込みごとに200回のエントリ)を行う必要があると考えます。

しかし、私はこれらの4000ルックアップを行う時間は、プロセスの他の部分と比較して無視できると思うでしょう。

+0

推理は、オンラインのExcelのthingamajiggerのようなものかもしれません。 HashMapは非常に高速ですが(ConcurrentHashMapはさらに高速です)、リクエストごとにマップが4000回呼び出された場合、JITはそれを最大限に最適化します。 – Esko

+0

@Esko ConcurrentHashMapは高速ですか?これはIteratorを使用して、HashMapのすべてのキー値対ハッシュ+インデックスを処理します。 yc – yclian

2

。それがない場合、あなたがやりたいようにコードを書くことがひどく難しいことではありません

(これで基本的なコードを持っているポストを見つけるためにオフにさまよう...)

うーん...ただ質問が私が思っているものであることを確かめるために...読み込み専用の側面が重要な部分か、データに素早くアクセスしようとしていますか?

編集:コードが遅い場合

はあなたがチェックしている(コメントに基づく)プロファイラで、参照するには?そうでなければ、まだそれについて心配するべきではありません。

+0

お返事ありがとうございます。後者(複数の読み)がより重要です。 これは、ハッシング/インデックス作成が何らかの形で改善できるかどうかを考えていたので、私は読み取り専用について述べた理由です。 yc – yclian

+0

変更不可能なマップは、基本となるマップのラッパーです。このようなレベルの委任を加えるために実際にパフォーマンスが低下します。 – erickson

+0

はい、したがって、私の質問だけでは、読み取り速度が重要で、コードがプロファイリングされていて、遅いことがわかっているかどうかを尋ねています:-) – TofuBeer

1

これが実際にボトルネックだった場合は、衝突を避けるためにマップのサイズを変更します。

0

読者が始める前に厳密に書いておけば、スレッド間の同期と共有は問題にならない... HashMapはあなたの友人だ。あなたがそれについて確信が持てないとき:ConcurrentHashMap。

どちらの実装もJDKの一部です。

0

数年前(学校プロジェクトとして)、私はCで、既存のコレクションを取った後、より多くのメモリを作成して、それを "封印"した、追記型の多数マッピング(および他のコレクション)を実装しました。キャッシュ効率の良い表現(例えば、グラフが最適化された配列として格納された)。驚くべきパフォーマンスの違いが見られました。

Javaはインターフェイスをサポートしているので、このような実装は非常に簡単です(実際には励まされます)が、私はすぐに使用できる実装に精通していません。

1

本当に問題がある場合は、perfect hashingを試してみてください。私はJavaの実装に慣れていません。

関連する問題