2011-12-22 3 views
2

ハッシュマップの配列を保持しているので、最大のパフォーマンスとメモリ使用率を得たいので、配列内でハッシュマップを再開したいと思います。配列内のハッシュマップを再利用する

これ以上必要ない配列にハッシュマップがあり、新しいハッシュマップを配列に追加する場合は、ハッシュマップをクリアしてput()を使用して新しい値を追加します。

また、配列からハッシュマップをリタイアするときに値をコピーする必要があります。

毎回new HashMap()を作成するよりも良いかどうかはわかりません。 何が良いですか?

UPDATE

サイクルにハッシュマップの約50 milionsを必要とする、各ハッシュマップは約10、キーと値のペアを有します。配列のサイズが20,000の場合は、50万の代わりに2万のハッシュマップが必要です。新しいハッシュマップ()

+0

あなたは何でも、あなたの質問はunanswerableある/データ/配列/ハッシュマップ上で何をするか、あなたの操作指示しない限り。 – CAFxX

+0

だから、あなたが書こうと思っているコードを推測してから、推測するデータを推測し、仮定したコードを思考実験によってプロファイリングするように求めていますか? – NPE

答えて

1

この方法には十分注意してください。それは、より良い性能面オブジェクトを再利用するかもしれませんが、次の例に示すように、あなたは、同じ参照を数回変更することで、トラブルに巻き込まれる可能性があります

public class A { 
    public int counter = 0; 

    public static void main(String[] args) { 

     A a = new A(); 
     a.counter = 5; 
     A b = a; // I want to save a into b and then recycle a for other purposes 
     a.counter = 10; // now b.counter is also 10 
    } 
} 

私はあなたがしかし場合は、ポイントを得たと確信しています配列からHashMapsへの参照をコピーしていない場合、それは問題ありません。

0

重要ではありません。時期尚早の最適化。 実際にほとんどのメモリまたはCPUサイクルを費やす

+0

これにはどのようなプロファイラが推奨されますか? – omrid

+0

@omrid:任意のプロファイラが行います。 VisualVMはJDKと連携します。 –

0

この方法でマップを再使用すると、パフォーマンスやメモリの使用率が向上する理由は完全にはっきりしません。私たちが知っている限り、それは差をつけないかもしれませんし、逆の効果をもたらすかもしれません。

最も可読性の高いコードで結果を得てから、最後にプロファイラがボトルネックとして強調するコードの部分を最適化する必要があります。

0

ほとんどの場合、あなたは何の違いも感じません。

通常、マップエントリの数はマップオブジェクトの数よりも多すぎます。マップを作成すると、エントリごとにMap.Entryのインスタンスが作成されます。これは比較的軽量のオブジェクトですが、とにかくnewを呼び出します。データなしのマップ自体は軽量であるため、マップで1-2個のエントリが保持されている場合を除き、これらの手法では何のメリットもありません。

ボトムライン。 成熟前の最適化については忘れてしまいます。アプリケーションを実装します。パフォーマンスの問題がある場合は、アプリケーションのプロファイルを作成し、ボトルネックを見つけて修正します。私はボトルネックが決してnew HashMap()コールになることはないことを99%保証することができます。

+0

私はこれを伝えます:約50百万のハッシュマップを循環させる必要があります。各ハッシュマップは約10ペアあります。配列のサイズが20,000の場合、新しいハッシュマップ()が50万個ではなく、2万個のハッシュマップしか必要としません。 – omrid

0

私はあなたが望むものは、オブジェクトプール(オブジェクトの場合は、そのHashMap)をオブジェクトプールから取得し、操作を実行し、オブジェクトが不要になった場合プールに戻ります。さらに参照チェックのためのオブジェクトプールのデザインパターンの

チェック、このリンク:

http://sourcemaking.com/design_patterns/object_pool

0

あなたが持っている問題は、オブジェクトのほとんどは、HashMapの中のMap.Entryオブジェクトであるということです。 HashMap自体(およびその配列)をリサイクルすることはできますが、これらはオブジェクトのほんの一部です。これを回避する方法の1つは、すべてをリサイクルし、ライフサイクル(このようにごみを最小限に抑えるように設計されています)を管理するためのサポートを提供するFastMapを使用することです。EnumMapを使用することが最も効率的だと思われます既知のキー属性)またはPOJOを使用することができます。

0

HashMap Sを再利用していくつかの問題があります。

  • キーと値のデータが(他の場所から共有)メモリーを取らないためにあったとしても、Map.Entryオブジェクトは、メモリ使用量を支配だろうが、(あなたは少し特別な何かをした場合を除く)再利用されません。
  • 世代別GCのために、一般に古いオブジェクトが新しいものを指していることは高価です(何が起こっているかを見るのは比較的難しい)。もしあなたが何百万というものを保っているのであれば、問題ではないかもしれません。
  • より複雑なコードは最適化するのが難しいです。だからシンプルにして、データ構造の変更を伴う大きな最適化を行ってください。