优化循环内对象的创建

时间:2009-11-16 19:10:25

标签: 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();
}

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

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

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

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

对于“相当大的数字”,这是一个非常紧凑的循环,所以通常我会说在循环之外移动实例化。但是,总的来说,我的猜测是你不会发现太大的差异,因为我愿意打赌你的doSomethingWithMap会花费大部分时间让GC赶上来。