在很多編程語言和他們的微優化的,我已經看到了,宣佈一個for循環中的數組的長度具有特別是在PHP和JavaScript性能的影響:閉環長度局部變量微型優化?
for i = 0, length = arr.length; i < length; ++i
我見過這種格式也用於C++和一些Java源代碼。這種微型優化是否適用於所有編程語言?如果這是一種與語言無關的微型優化,它不應該從編譯器中進行優化嗎?
在很多編程語言和他們的微優化的,我已經看到了,宣佈一個for循環中的數組的長度具有特別是在PHP和JavaScript性能的影響:閉環長度局部變量微型優化?
for i = 0, length = arr.length; i < length; ++i
我見過這種格式也用於C++和一些Java源代碼。這種微型優化是否適用於所有編程語言?如果這是一種與語言無關的微型優化,它不應該從編譯器中進行優化嗎?
嗯,我認爲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不會影響性能。
編譯器的問題是要知道arr.length
將在循環中每次迭代都返回相同的值。有時它不會,例如,當循環體將新元素插入arr
時。
我理解不使用這種格式的意義,但它是非變異例程中最常見的for循環實現之一。格式非常單調乏味,跨越文本編輯器。我希望至少有一個編譯器可以優化它(因爲每個循環都是任意的,因爲它們不保證順序)。 – 2011-04-09 11:36:08
與我的電腦相同的結果,但仍然錯誤。切換兩個測試用例,它將完全相反。所以實際上是一個「冷」jr prpr。 – Howard 2011-04-09 07:46:09