2013-02-26 63 views
2

多次讀取同一個索引時,JVM能夠優化數組讀取嗎?考慮以下內容:JVM可以優化多個數組中的多個讀取操作

public static void foo(int[] array) { 
    for (int i=0; i<array.length; i++) { 
     int value1 = array[i]; 
     ... 
     int value2 = array[i]; 
     ... 
    } 
    ... 
} 

array[i]在循環中被讀取兩次。假設array[i]未在循環中重新分配,JVM是否允許假設array[i]沒有更改,因此只讀取其值?由於array是一個傳入的可變對象,它可能會在第一次和第二次讀取之間發生變化。

我查看了生成的字節碼,它確實讀取了兩次(daloadarray[i]。 JVM是否允許將其優化爲一次讀取?

+2

我們可以假設您在詢問HotSpot VM嗎? – 2013-02-26 23:24:07

+0

這真的是一個關於Java內存模型的問題。 JVM供應商無關緊要。實際上它將是Sun的Hotspot JVM。 – 2013-02-26 23:28:34

回答

2

是的,優化器只考慮單線程數據流,不關心一個變量是否被另一個線程改變,除非涉及到volatile/synchronized。

即使沒有優化,第二次讀取應該非常快,大約1ns,因爲數據最有可能在L1緩存中。

0

我不認爲JVM會優化這個讀取,但daload操作的開銷應該是微不足道的。

如果你想從陣列讀取值只有一次,儘量分配到一個局部變量(花費一些瑣碎的局部變量堆棧存儲器)

int origVal = array[i]; 
int value1 = origVal; 
... 
int value2 = origVal; 

測試應該證明的變化是任意的。