2013-02-27 2 views
0

Насколько эффективнее делать предварительный инкремент против пост-инкремента в цикле for в java?Предварительное и последующее приращение в цикле for

Пример кода:

for (int i=0; i<10; i++) 

и

for (int i=0; i<10; ++i) 

Я заметил, что когда я делаю Преинкремент, время выполнения является меньшим, что, когда я делаю пост-инкремент. Любые предложения о том, почему это может быть так? Благодарю.

+0

Каким был ваш тест, где время было меньше? – Danny

+10

показать свой тест. Не должно быть разницы .... – jlordo

+0

может из-за того, что приращение по почте требует дополнительной копии. :). –

ответ

0

Пост-инкремент и предварительное приращение (или декремент) в основном означают, что если вы используете pre-increment, например ++ i, это оценивается до остальной части этой строки кода. Если используется пост-инкремент, такой как i ++, это оценивается после остальной части строки кода. Возможно, именно поэтому вы получаете «более быстрое время выполнения».

+4

, выполняет ли он первый или последний, не влияет на общую производительность. – 75inchpianist

+0

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

3

Если ваше тело цикла не имеет ничего общего, этот вопрос является спорным: накладные расходы переменного приращения равны нулю. Даже если накладные расходы выделяются, его величина совершенно непредсказуема и может сильно варьироваться даже при разных экземплярах одного и того же JVM на одном и том же оборудовании. Разумеется, «дикая» вариация находится в диапазоне 0,2 нс.

10

Я составил минимальный пример (Oracle jdk1.7.0_07):

public void post() { 
    for (int i=0; i<10; i++) { 

    } 
} 

public void pre() { 
    for (int i=0; i<10; ++i) { 

    } 
} 

Оба метода получают точно такой же байт-код:

0 iconst_0 
1 istore_1 
2 goto 8 (+6) 
5 iinc 1 by 1 
8 iload_1 
9 bipush 10 
11 if_icmplt 5 (-6) 
14 return 
+0

Конечно, JIT скомпилирует весь этот shebang в одну инструкцию 'return'. –

+0

@MarkoTopolnik: Будет ли JIT всегда делать это или просто для большого количества итераций? – jlordo

+1

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

0

Там нет таких проблем производительности на основе этого. Оба они точно такие же, когда дело доходит до производительности. И вы не можете претендовать на ++, я должен использовать вместо i ++, это зависит от логики, которую мы будем обрабатывать. ++ i означает приращение сначала, затем перейдите к работе, в то время как i ++ означает перейти на работу, а затем увеличить. Посмотрите на следующие вопросы.

How do the post increment (i++) and pre increment (++i) operators work in Java?

Язык Независимый пример: Difference between i++ and ++i in a loop?

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