以下哪項在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(而不是簡單的attmepts手動優化代碼)。
時間它自己,看看。 – 2009-11-16 19:12:29
我的猜測是第一個選擇,但我沒有數據支持它,所以我不會寫這個答案。看起來第二個選項會要求垃圾收集不夠聰明以確定匹配對象是否存在並且未被使用。我會關注這個問題,因爲我對答案很感興趣。 – martinatime 2009-11-16 19:16:14