Приращение: x ++ vs x + = 1

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

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

for(x = 0; x < 1000; x += 1) vs 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, когда выполняется в большом цикле?

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Вот пример.

Ответ 5

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

x = x + 1;

будет переведен на этот код:

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

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

incr $[x] ;increment by 1

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

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