В Java будет какое-либо влияние на производительность при использовании оператора post increment vs pre increment?Различия в производительности между операторами пост-и предварительного инкремента.
Пример:
i++
++i
В Java будет какое-либо влияние на производительность при использовании оператора post increment vs pre increment?Различия в производительности между операторами пост-и предварительного инкремента.
Пример:
i++
++i
вопрос производительности имеет смысл только в контексте, где функциональное поведение является идентичным (так как, если функциональность отличается, правильное поведение превосходит ежеминутно-быстрее, один), поэтому я предполагаю, что вы имеете в виду ситуацию, когда значение выражения не используется? То есть, где единственной целью выражения является увеличение i
? В такой ситуации ответ отрицательный: нет разницы в производительности, и на самом деле никакой разницы вообще нет. Я только что собрали этот класс:
public class Foo
{
public static void main(final String args[])
{
int i = Integer.parseInt(args[0]);
i++;
}
}
и вычислить контрольную сумму MD5 в результате Foo.class
; и, аналогично, для версии с ++i
. У них была та же контрольная сумма, что указывает на то, что две версии были скомпилированы в точный байт-код, и поэтому он будет выполнять буквально тождественно.
(Естественно, это может, в теории, зависит от компилятора. Другой компилятор может принять решение о компиляции i++
отличается от ++i
даже в условиях, когда они эквивалентны. Но я сомневаюсь, что, и это действительно не стоит беспокоиться, даже если это так.)
Не ответ, если вы не утверждаете, что 'i = i ++;' и 'i = ++ i;' компилируются в один и тот же код. – EJP
@EJP: Не могли бы вы рассказать о том, как это важно? – ruakh
Это актуально, потому что, очевидно, эти утверждения * не * компилируются с одним и тем же байтовым кодом, и легко построить больше, если это вас не устраивает. Вы попали в случай исключения, когда до или после - не имеет значения. Если бы это действительно было неважно, во всех случаях у вас их не было бы на этом языке, не так ли? – EJP
Необходимая продолжительность выполнения для самого приращения должна быть одинаковой, но если вы используете предварительный или пост-инкремент, очевидно, может повлиять на производительность окружающего кода и пост-инкремент может в большей степени быть оптимизирован.
Есть также некоторые неочевидные случаи, когда производительность окружающего кода изменяется. По крайней мере, при запуске с сервером 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);
}
Насколько я знаю, там нет разница, производительность -wise –
Запустить тест и узнать? – cdeszaq
Возможный дубликат [Очень простая производительность кода] (http://stackoverflow.com/questions/4110764/very-basic-code-performance) – assylias