Описание тега strength-reduction
Замена дорогостоящих операций на более дешевые. Классический пример: x = n * i в цикле становится x += n.
Снижение прочности - это практика оптимизации путем замены дорогостоящих операций более дешевыми. (См. https://en.wikipedia.org/wiki/Strength_reduction).
Классический пример:
for (int i=0 ; i<1024 ; i++) {
a[i] = b[i * 33];
}
может быть преобразован компилятором или человеком в код, реализующий его как
int i33 = 0;
for (int i=0 ; i<1024 ; i++) {
a[i] = b[i33];
i33 += 33;
}
Умножение все еще несколько дороже, чем добавление на современных компьютерах, и компиляторы прилагают некоторые усилия, чтобы заменить их одной или двумя сменами + инструкции сложения. См., Например, Как умножить регистр на 37, используя только 2 последовательные инструкции leal в x-86?
Другой пример - оптимизация n % 4
к n & 3
(для неподписанных n
или в более сложную последовательность для подписанных n
), потому что инструкции аппаратного деления по-прежнему очень дороги.