优化循环内对象的创建

Sim*_*onC 1 java optimization jvm-hotspot

在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();
}
Run Code Online (Sandbox Code Playgroud)

要么

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

我认为他们对意图都很清楚,所以我不认为风格/增加复杂性是一个问题.

直觉看起来第一个会更好,因为只有一个'新'.但是,如果不保留对地图的引用,HotSpot是否能够确定为每个循环创建相同大小的映射(内部为Entry [someNotSoLargeNumber]),然后使用相同的内存块(即不做了很多内存分配,只是将调零比调用每个循环的clear()更快?

一个可接受的答案是指向文档的链接,该文档描述了HotSpot VM实际可以实现的不同类型的优化,以及如何编写代码来协助HotSpot(而不是手动优化代码的天真魅力).

Dmi*_*try 7

除非你的探查者说你应该这样做,否则不要把时间花在这种微观优化上.特别是,Sun声称现代垃圾收集器可以很好地处理短寿命物品,而新的()变得更便宜,更便宜