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(而不是手动优化代码的天真魅力).