Инкремент: х ++ против х + = 1 - PullRequest
13 голосов
/ 28 июня 2011

Я читал, что многие разработчики используют x + = 1 вместо x ++ для ясности. Я понимаю, что x ++ может быть неоднозначным для новых разработчиков и что x + = 1 всегда более понятен, но есть ли разница в эффективности между ними?

Пример использования цикла for:

for(x = 0; x < 1000; x += 1) против for(x = 0; x < 1000; x++)

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

Другой пример:

while(x < 1000) {
    someArray[x];
    x += 1;
}

против

while(x < 1000) {
    someArray[x++];
}

Можно ли заменить x ++ на x + = 1 без потери производительности? Меня особенно беспокоит второй пример, потому что я использую две строки вместо одной.

А как насчет увеличения элемента в массиве? Будет ли someArray[i]++ быстрее, чем someArray[i] += 1, когда выполняется большой цикл?

Ответы [ 5 ]

19 голосов
/ 28 июня 2011

Любой здравомыслящий или безумный компилятор выдаст идентичный машинный код для обоих.

5 голосов
/ 28 июня 2011

Предполагая, что вы говорите о применении их к базовым типам, и у вас нет собственных классов, в которых они могли бы иметь огромное значение, они могут давать тот же результат, особенно когда включена оптимизация.К моему удивлению, я часто обнаруживал в декомпилированных приложениях, что x + = 1 используется поверх x ++ на уровне ассемблера (добавить против inc).

4 голосов
/ 28 июня 2011

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

Если вы хотите убедить себя, просто сделайте эталонный тест.

0 голосов
/ 19 сентября 2012

Представьте, что вы - ленивый разработчик компилятора и не хотите писать подпрограммы ОПТИМИЗАЦИИ в модуле машинного кода.

x = x + 1;

будет переведено вЭТОТ код:

mov $[x],$ACC
iadd $1,$ACC
mov $ACC,$[x]

И x ++ будет переведен в:

incr $[x] ;increment by 1

, если ОДНА инструкция будет выполнена за 1 машинный цикл, тогда x = x + 1 займет 3 машинных цикла, гдетак как x ++ займет 1 машинный цикл.(Гипотетическая машина используется здесь).

НО, к счастью, большинство разработчиков компиляторов НЕ ленивы и будут писать оптимизации в модуле машинного кода.Таким образом, x = x + 1 и x ++ ДОЛЖНЫ занять одинаковое время для выполнения.:-P

0 голосов
/ 29 июня 2011

Когда вы говорите «это может сложиться в долгосрочной перспективе» - не думайте об этом так.

Скорее думайте в процентах. Когда вы обнаружите, что счетчик программы находится в этом точном коде 10% или более времени, тогда беспокойтесь об этом. Причина в том, что, если процент небольшой, то самое большое, что вы могли бы сэкономить, улучшив его, также мало.

Если процент времени меньше 10%, у вас почти наверняка гораздо больше возможностей для ускорения в других частях кода, почти всегда в виде вызовов функций, которых вы могли бы избежать.

Вот пример.

...