1

次のうち、Java 6 HotSpot VM でより最適なのはどれですか?

final Map<Foo,Bar> map = new HashMap<Foo,Bar>(someNotSoLargeNumber);    
for (int i = 0; i < someLargeNumber; i++)
{
  doSomethingWithMap(map);
  map.clear();
}

また

final int someNotSoLargeNumber = ...;
for (int i = 0; i < someLargeNumber; i++)
{
  final Map<Foo,Bar> map = new HashMap<Foo,Bar>(someNotSoLargeNumber);      
  doSomethingWithMap(map);
}

どちらも意図がはっきりしていると思うので、ここではスタイルや追加された複雑さが問題になるとは思いません。

直観的には、'new' は 1 つしかないので、最初のほうが良いように見えます。ただし、マップへの参照が保持されていない場合、HotSpot はループごとに同じサイズ (内部では Entry[someNotSoLargeNumber]) のマップが作成されていると判断し、同じメモリ ブロックを使用します (つまり、そうではありません)。ループごとに clear() を呼び出すよりも速いかもしれないゼロ化だけで、多くのメモリ割り当てを行いますか?

受け入れられる答えは、HotSpot VM が実際に実行できるさまざまなタイプの最適化、および HotSpot を支援するコードの記述方法を説明するドキュメントへのリンクです (手作業でコードを最適化する単純な試みではなく)。

4

2 に答える 2

7

プロファイラーがそれを行うべきだと言わない限り、そのようなマイクロ最適化に時間を費やさないでください。特に、Sunは、現代のガベージコレクターは短命のオブジェクトで非常にうまく機能し、new()はますます安くなると主張しています

于 2009-11-16T19:15:25.117 に答える
1

これは「かなり大きな数」に対するかなりタイトなループなので、一般的にはインスタンス化をループの外に移動すると言います。doSomethingWithMapしかし、全体として、GCが追いつくまでに大部分の時間がかかることは間違いないので、大きな違いに気付くことはないと思います。

于 2009-11-16T19:18:00.883 に答える