2012-03-19 4 views
4

В Java будет какое-либо влияние на производительность при использовании оператора post increment vs pre increment?Различия в производительности между операторами пост-и предварительного инкремента.

Пример:

i++ 

++i 
+2

Насколько я знаю, там нет разница, производительность -wise –

+0

Запустить тест и узнать? – cdeszaq

+0

Возможный дубликат [Очень простая производительность кода] (http://stackoverflow.com/questions/4110764/very-basic-code-performance) – assylias

ответ

13

вопрос производительности имеет смысл только в контексте, где функциональное поведение является идентичным (так как, если функциональность отличается, правильное поведение превосходит ежеминутно-быстрее, один), поэтому я предполагаю, что вы имеете в виду ситуацию, когда значение выражения не используется? То есть, где единственной целью выражения является увеличение i? В такой ситуации ответ отрицательный: нет разницы в производительности, и на самом деле никакой разницы вообще нет. Я только что собрали этот класс:

public class Foo 
{ 
    public static void main(final String args[]) 
    { 
     int i = Integer.parseInt(args[0]); 
     i++; 
    } 
} 

и вычислить контрольную сумму MD5 в результате Foo.class; и, аналогично, для версии с ++i. У них была та же контрольная сумма, что указывает на то, что две версии были скомпилированы в точный байт-код, и поэтому он будет выполнять буквально тождественно.

(Естественно, это может, в теории, зависит от компилятора. Другой компилятор может принять решение о компиляции i++ отличается от ++i даже в условиях, когда они эквивалентны. Но я сомневаюсь, что, и это действительно не стоит беспокоиться, даже если это так.)

+1

Не ответ, если вы не утверждаете, что 'i = i ++;' и 'i = ++ i;' компилируются в один и тот же код. – EJP

+2

@EJP: Не могли бы вы рассказать о том, как это важно? – ruakh

+1

Это актуально, потому что, очевидно, эти утверждения * не * компилируются с одним и тем же байтовым кодом, и легко построить больше, если это вас не устраивает. Вы попали в случай исключения, когда до или после - не имеет значения. Если бы это действительно было неважно, во всех случаях у вас их не было бы на этом языке, не так ли? – EJP

1

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

Есть также некоторые неочевидные случаи, когда производительность окружающего кода изменяется. По крайней мере, при запуске с сервером Oracle, VM на x86 или x64 аппаратных средств, следующие петли имеют существенное различие в их выполнения:

long a=0, b=0; 
for(int i=0;i<1000000;i++) { 
    b = 3; 
    a += i * (b++); 
} 

...

long a=0, b=0; 
for(int i=0;i<1000000;i++) { 
    b = 3; 
    a += i * (++b); 
} 
Смежные вопросы