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);
}

我认为它们的意图都很清楚,所以我不认为风格/增加的复杂性是这里的问题。

直觉上看起来第一个会更好,因为只有一个“新”。但是,鉴于没有保留对映射的引用,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 回答