2010-05-25 3 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++) {}; и мне нужно установить ntiate 1000 объектов, как он отличается, когда я объявляю объект внутри цикла из объявления его вне цикла?

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

против

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

Очевидно, что объект доступен либо только из сферы петли или из области, которая окружает его. Но я не понимаю вопрос о производительности, сбор мусора и т. Д.

Что такое лучшая практика? Спасибо

ответ

4

Первая форма лучше. Ограничение объема переменной облегчает читателям понимание того, где и как он используется.

Производительность, есть некоторые небольшие преимущества для ограниченного объема, о которых вы можете прочитать в another answer. Но эти проблемы являются вторичными по отношению к пониманию кода.

0

Нет никакой разницы. Компилятор оптимизирует их в одном и том же месте.

+0

Неправильно. Попробуйте два из них подряд и сравните байт-код. – EJP

+1

Байт-код не имеет значения. Это то, что JIT оптимизирует в машинный код, который имеет значение. – bmargulies

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 

}} 

вы можете получить, сколько времени займет один, если вы уменьшаете время другого ... (если вы понимаете, что я имею в виду)

надеюсь, что это сэкономит вам время.

вещь, которую вам нужно понять, это то, что я проверил это, чтобы оптимизировать мой цикл обновления краски на моей платформе, и это помогло. Адам.

Смежные вопросы