2011-12-03 6 views
2

メンバーとしてハッシュマップを含むJavaクラスがあります。このクラスは多くのオブジェクトで作成されます。これらの多くの場合、このタイプのオブジェクトの1つが別のオブジェクトに複製され、変更されます。変更によってハッシュマップが変更されるため、複製が必要です。元のオブジェクトの元のハッシュマップをそのまま維持する必要があります。ハッシュマップをクローンするJavaコードの高速化に関する提案はありますか?

誰かがクローニングのスピードを上げる方法や、それを避けるためのトリックを提案しているのだろうかと思います。私がコードをプロファイリングするとき、ほとんどの時間は、これらのハッシュマップ(通常は非常に小さな値のセット、数百など)のクローニングに費やされます。

(私は現在、コルトOpenIntDoubleHashMap実装を使用しています。)

+0

私はHashMapのコードを見て、 'clone'はゼロから始め、すべてのハッシュキーを再計算します。あなたはHashMapのサブクラスを書き直すことができますが、それは残忍で、おそらく、なぜ非効率な 'クローン 'を選ぶのがよい理由がありますか? – toto2

+0

より具体的にタイトルを変更 – MartinL

答えて

1

あなたはそれのために、より効果的なアルゴリズムを使用する必要があります。 http://code.google.com/p/pcollections/ライブラリでは、不変のマップを可能にするPMap構造を見てください。

UPDATE

マップは、(あなたが唯一の数百と)非常に小さい場合は、多分より効果的なのは、ちょうど2つの配列のようになります。マップのクローンを作成するために、この場合

int keys[size]; 
double values[size]; 

ます非常に速く働くべきであるSystem.arraycopyを使用する必要があります。

+0

私は考えが好きで、理論的にはそれが私の必要なものですが、実際にはこれを使用するとコードが遅くなります... – kloop

+0

ベンチマークテストのコードを教えてください。たぶんあなたは何かを効果的にやっているかもしれません。 – kan

+0

これは答えが最も近いように設定されており、理論的にはうまくいくはずです。しかし、pcollectionsはこの場合に役立つようではありません。 – kloop

0

オリジナルが偶数だけ変更される場合は、copy-on-writeラッパーをマップに実装することがあります。

+0

私は実際にここにコピーオンライトを持っています。それを変更するメソッドのうちのどれかが使用されます。これはあまり役に立ちません。なぜなら、ある時点ではほとんどのハッシュマップがコピーされる必要があるからです。 – kloop

0

オブジェクトのごく一部を変更する場合は、二層構造を実現することができます。

  1. レイヤ1は、元のマップです。
  2. レイヤ2は変更された要素のみを保持します。

変更が必要な元のマップのオブジェクトはすべて複製され、putをレイヤー2マップに変更しました。

ルックアップはまずレイヤ2マップを参照し、オブジェクトが見つからない場合はレイヤ1マップに戻ります。

関連する問題