Об оптимизациях

min = x ^ ((y ^ x) & -(x > y));
Она, по мысли участника
min = (x < y)? x: y;
тем, что не содержит условных переходов, и, тем самым, неоптимальностей, вызванных вероятностью неверного предсказания этого перехода предиктором переходов процессора.
Ну а стандартные варианты std::min(x, y) и (оужас) std::min({x, y}) были объявлены некошерными заранее, особенно последний вариант, который, по мысли участника
Однако, давайте проверим. В качестве тестовой выбирем архитектуру ARM32, оптимизация -O1, компилятор gcc 8.2.
Первый вариант:
min1:
cmp r1, r0
movlt r0, r1
bx lr
Второй вариант:
min2:
cmp r1, r0
movlt r0, r1
bx lr
Вариант с std::min(x, y):
min3(int, int): cmp r1, r0 movlt r0, r1 bx lr
Вариант с std::min({x, y}):
min4(int, int): cmp r1, r0 movlt r0, r1 bx lr
Вот так.
Если вы считаете, что ваш код будет оптимальным, потому что (вписать нужное), то, скорее всего, вы считаете неверно. Если вам нужно сэкономить время до такта, смотрите выход компилятора, не делайте предположений. Если нет, не пишите "оптимальный" вариант, пишите самый простой и очевидный, компилятор его соптимизирует (в большинстве случаев). И только если вы действительно видите на выходе компилятора какую-то дичь, следует разбираться, как это оптимизировать, но не раньше. Компиляторы несколько шагнули вперёд по сравнению с временами PDP-11, и не стоит их недооценивать.
|
</> |