2013-10-21 84 views
2

參考地點。 http://en.wikipedia.org/wiki/Locality_of_reference。 所以它像迭代一個小的int數組會更快,然後迭代linkedList。 由於陣列是連續的,並且所有陣列都可以放入cpu緩存中,並且緩存未命中會更少。易變陣列和參考地點

但我想要一個簡單的int數組和易失性數組之間的比較。 AFAIK在易失性數組上迭代會導致每次都進行易失性讀取,這可能會在某些系統中導致在每次讀取時更新緩存。

int[] arr; // assume here i have declared and initialized it. 
int sum = 0; 
for(int i=0;i<arr.length;i++){ 
    sum = sum + arr[i]; 
} 

揮發性計數器部分

volatile int[] arr; // assume here i have declared and initialized it. 
int sum = 0; 
for(int i=0;i<arr.length;i++){ 
    sum = sum + arr[i]; // volatile read everytime 
} 

所以他們會是相同或編譯器就可以把所有的揮發性讀入一個單一的揮發性讀取(編譯優化)

+1

你試過比較生成的字節碼嗎?當詢問(非JIT)編譯器優化時,這通常是一個很好的起點。 –

+2

我對你想做什麼感到困惑。 'int arr;'不初始化數組。此外,這個正確的代碼:'volatile int [] arr = new int [len];'不會用volatile元素初始化一個數組。只有對數組的volatile參考。 http://jeremymanson.blogspot.com/2009/06/volatile-arrays-in-java.html – Radiodef

+0

嗨yahh我知道..我說假設他們初始化那裏..不想寫代碼:)。其次,我知道它是一個volatile引用數組,因此每次你執行arr [i]時它都是一個volatile變量,因爲它首先讀取數組和相應的位置 – veritas

回答

3

如果需要揮發性訪問一個數組,你可以使用AtomicIntegerArray。這包裝了一個int數組,但提供了線程安全語義。

AtomicIntegerArray array = new AtomicIntegerArray(100); 
array.addAndGet(1); 
array.lazySet(10, 123); 
int n = array.get(5); // volatile get 
array.set(9, 333); // volatile set. 
0

只是略有改善,以科學家的代碼:你實際上並不需要額外的揮發性布爾標誌,你可以只用以下度日:

volatile int[] array = ...; 

void write(int index, int value){ 
    array[index]=value; 
    array = array; // explicit volatile write 
} 

int read(int index){ 
    return array[index]; // implicit volatile read 
} 

主要的變化是,你不因爲訪問數組的第i個元素涉及讀取對數組的volatile參考(JIT /編譯器實際上是否是另一回事,但它必須爲您提供相同的保證)。所以這非常好,因爲它完全是你編寫的代碼。 可悲的是,這不適用於寫入數組,所以你必須做到這一點非常醜陋的自我分配。

這就是說,AtomicIntegerArray類與此一樣高效(至少希望如此),並使整個事情變得明確。