0

クラスA

Class A {
    public HashMap <Integer,Double> myHashMap;

public A(){
    myHashMap = new HashMap()
}
}

クラスB

Class B {
    private A anInstanceOfA;

public B(A a) {
    this.anInstanceOfA = a;
}


aMethod(){  
     anInstanceOfA.myHashMap.get(1); <--getting hashmap value for key = 1

      //proceed to use this value, but instead of storing it to a variable
      // I use anInstanceOfA.myHashMap.get(1) each time I need that value.
}

の値を取得するためにaMethod()使用します。私はそれを複数回行いますが、複数回使用するか、変数に割り当てるだけで、割り当てられた変数を複数回使用することで効率に違いがあるかどうか疑問に思っています。anInstanceOfA.myHashMap.get(1)key = 1aMethod()anInstanceOfA.myHashMap.get(1)

IE

aMethod(){
     theValue = anInstanceOfA.myHashMap.get(1);

     //proceed to use theValue in my calculations. Is there a difference in efficiency?
}
4

4 に答える 4

2

問題は、get(l) を 1 回だけではなく複数回呼び出す方がコストがかかるかどうかを知りたいということです。

これに対する答えはイエスです。問題は、それだけで十分かどうかです。決定的な答えは、プロファイリングによって JVM に問い合わせることです。ただし、選択した実装の get メソッドを見て推測し、毎回すべての作業を実行する必要があるかどうかを検討できます。

変数に値を入れたいと思う別の理由があることに注意してください。つまり、わかりやすい名前を付けて、将来のプログラムの保守を容易にすることができます。

于 2013-05-06T06:10:21.503 に答える
0

これはマイクロ最適化のように見えますが、実際には物事のスキームに大きな違いはありません。

@peterがすでに示唆しているように、スタイル/読みやすさの「最適化」は、最初のオプションよりも2番目のオプションを選択するためのより良い根拠です。速度の最適化は、実際に多くの呼び出しを行う場合、または呼び出しが非常に高価な場合にのみ意味を持ち始めます。現在の例ではおそらくどちらも当てはまりません。

于 2013-05-06T06:10:08.470 に答える
0

複数の理由から、ローカル変数に入れます。

  • それははるかに高速になります。ローカル変数の読み取りは、HashMap ルックアップよりも確実に安価であり、おそらく 10 ~ 100 倍です。
  • ローカル変数に適切で意味のある名前を付けることができます
  • 特にローカル変数を何度も使用する場合、コードはおそらく全体的に短く/シンプルになります。
  • 誰かが呼び出しの 1 つを変更し、他の呼び出しを変更するのを忘れた場合、将来のメンテナンス中にバグが発生する可能性があります。getこれは、コードを複製するときはいつでも問題になります。ローカル変数を使用すると、このリスクが最小限に抑えられます。
  • 同時発生の状況では、HashMap が他のコードによって変更されると、理論的には値が変わる可能性があります。通常、一度値を取得して、同じ値で作業する必要があります。ただし、この性質の問題に遭遇した場合は、おそらく最初に他の解決策 (ロック、同時コレクションなど) を検討する必要があります。
于 2013-05-06T06:20:49.243 に答える