2010-05-25 53 views
3

可能顯示的文件:
Which loop has better performance? Why?
Which is optimal ?
循環時Efficiency of Java code with primitive typesjava的循環 - 一類的聲明外/內循環

,例如:

for (int j = 0; j < 1000; j++) {};我需要安心賦值1000個對象,當我在循環內聲明它在循環外部聲明時,它有什麼不同?

for (int j = 0; j < 1000; j++) {Object obj; obj =} 

VS

Object obj; 
for (int j = 0; j < 1000; j++) {obj =} 

很明顯的是,對象是隻從循環範圍或者從周圍的範圍進行訪問。但我不明白性能問題,垃圾收集等。

什麼是最佳實踐?謝謝

回答

4

第一種形式更好。限制變量的範圍可以讓讀者更容易理解它在哪裏以及如何使用。

從表現上看,有限範圍也有一些小優點,你可以在another answer.中看到,但這些問題僅次於代碼理解。

0

沒有區別。編譯器會將它們優化到相同的地方。

+0

不正確。連續嘗試其中兩個並比較字節碼。 – EJP 2010-05-26 00:47:57

+1

字節碼不重要。它的JIT將其優化到機器代碼中。 – bmargulies 2010-05-26 01:01:06

0

我測試過這個問題我的機器的差異約爲2-4ms超過10000種情況下,我測試的所有類的東西,就像如果你實例化並分配值:比較

int i=0; 

int i; 
i=0; 

這裏是我用於測試的代碼,當然,我改變了它的測試,並且有一個初始平衡作用機器達到優化前,你可以看到,在明確一旦測試:

package initializer; 
public final class EfficiencyTests { 
private static class Stoper { 
    private long initTime; 
    private long executionDuration; 

    public Stoper() { 
    // TODO Auto-generated constructor stub 
    } 
    private void start() { 
     initTime = System.nanoTime(); 
    } 
    private void stop() { 
     executionDuration = System.nanoTime() - initTime; 
    } 
    @Override 
    public String toString() { 
     return executionDuration + " nanos"; 
    } 
} 

private static Stoper stoper = new Stoper(); 

public static void main(String[] args) { 
    for (int i = 0; i < 100; i++) { 
     theCycleOfAForLoop(100000); 
     theCycleOfAForLoopWithACallToSize(100000); 
     howLongDoesItTakeToSetValueToAVariable(100000); 
     howLongDoesItTakeToDefineAVariable(100000); 
     System.out.println("\n"); 
    } 
} 
private static void theCycleOfAForLoop(int loops) { 
    stoper.start(); 
    for (int i = 0; i < loops; i++); 
    stoper.stop(); 
    System.out.println("The average duration of 10 cycles of an empty 'for' loop over " + loops + " iterations is: " + stoper.executionDuration * 10/loops); 
} 
private static void theCycleOfAForLoopWithACallToSize(int loops) { 
    ArrayList<Object> objects=new ArrayList<Object>(); 
    for (int i = 0; i < loops; i++) 
     objects.add(new Object()); 
    stoper.start(); 
    for (int i = 0; i < objects.size(); i++); 
    stoper.stop(); 
    System.out.println("The average duration of 10 cycles of an empty 'for' loop with call to size over " + loops + " iterations is: " + stoper.executionDuration * 10/loops); 

} 
private static void howLongDoesItTakeToSetValueToAVariable(int loops) { 
    int value = 0; 
    stoper.start(); 
    for (int i = 0; i < loops; i++) { 
     value = 2; 
    } 
    stoper.stop(); 
    System.out.println("The average duration of 10 cycles of setting a variable to a constant over " + loops + " iterations is: " + stoper.executionDuration * 10/loops); 
} 
private static void howLongDoesItTakeToDefineAVariable(int loops) { 
    stoper.start(); 
    for (int i = 0; i < loops; i++) { 
     int value = 0; 
    } 
    stoper.stop(); 
    System.out.println("The average duration of 10 cycles of initializing and setting a variable to a constant over " + loops + " iterations is: " + stoper.executionDuration * 10/loops); 

} 

private static void runAForLoopOnAnArrayOfObjects() { 
// TODO Auto-generated method stub 

}} 

你可以得到你,如果你減少其他的一個時間有多長......(如果你明白我的意思)

希望這節省您的時間。

你需要明白的是我測試了這些東西來優化我的平臺的繪製更新循環,並且它有所幫助。 亞當。