2011-04-09 29 views
1

在很多編程語言和他們的微優化的,我已經看到了,宣佈一個for循環中的數組的長度具有特別是在PHP和JavaScript性能的影響:閉環長度局部變量微型優化?

for i = 0, length = arr.length; i < length; ++i 

我見過這種格式也用於C++和一些Java源代碼。這種微型優化是否適用於所有編程語言?如果這是一種與語言無關的微型優化,它不應該從編譯器中進行優化嗎?

回答

0

嗯,我認爲Java編譯器會照顧有關這種優化的,但它不是這樣:

public static void main(String[] args) { 
    String[] array = new String[10000000]; 
    Arrays.fill(array, "Test"); 
    long startNoSize = Calendar.getInstance().getTimeInMillis(); 
    for(int i=0; i< array.length;i++) 
    { 
     array[i]=String.valueOf(i+1); 
    } 
    long finishNoSize = Calendar.getInstance().getTimeInMillis(); 
    System.out.println(finishNoSize-startNoSize); 
    System.out.println("Size saved"); 
    int length = array.length; 
    long startSize = Calendar.getInstance().getTimeInMillis(); 
    for(int i=0; i< length;i++) 
    { 
     array[i]=String.valueOf(i+2); 
    } 
    long finishSize = Calendar.getInstance().getTimeInMillis(); 
    System.out.println(finishSize-startSize); 
} 

一些連續運行後的結果是這樣的:

6207 
Size saved 
4594 

所以有1500毫秒的差異。

UPDATE 當環路逆轉,結果是相反的太:) 所以有與沒有優化的任何問題。

所以在Java中調用Container.size不會影響性能。

+0

與我的電腦相同的結果,但仍然錯誤。切換兩個測試用例,它將完全相反。所以實際上是一個「冷」jr prpr。 – Howard 2011-04-09 07:46:09

0

編譯器的問題是要知道arr.length將在循環中每次迭代都返回相同的值。有時它不會,例如,當循環體將新元素插入arr時。

+0

我理解不使用這種格式的意義,但它是非變異例程中最常見的for循環實現之一。格式非常單調乏味,跨越文本編輯器。我希望至少有一個編譯器可以優化它(因爲每個循環都是任意的,因爲它們不保證順序)。 – 2011-04-09 11:36:08