История изменений
Исправление emulek, (текущая версия) :
Каждый неправильно предсказанный джамп — полный перезапуск конвеера. Там, где сильно критична производительность арифметики, выкидывают все переходы насколько возможно.
предлагаешь запихать ветвление в макрос, и потом использовать его в каждой строчки по три раза?
На практике вычисление индекса и его последующее использование в вычислениях зачастую оказываются быстрее блока if else if.
на практике блок if else компилятор сам может выкинуть, и выкидывает. А вот если ты ветвление запихал в вычисление индекса, неявно, компилятор это ветвление выкинуть не может. Особенно НЕ радует ноль. Эдди дело говорит, у float нулей нет, это особый случай. Но ты ведь всё равно пихаешь дополнительное ветвление, на случай нуля, которого нет. И компилятор вынужден включать в код эту не нужную проверку.
И вообще, такие примитивные оптимизации известны не только тебе, но и разработчикам компилятора. Будет лучше, если ты займёшься алгоритмом, а не ветвлениями. С ветвлениями компилятор справится лучше тебя, т.к. знает целевой процессор, а ты — не знаешь (или ты одмин локалхоста?). С алгоритмом компилятор справится пока не в состоянии, и заниматься алгоритмом придётся тебе.
ЗЫЖ «выкидывать переходы» тоже надо с умом. Многие переходы отлично предсказываются, и альтернативный вариант оказывается медленнее. Также надо помнить о том, что кеш L1 очень небольшой, и если код туда не влезет, производительность упадёт ниже плинтуса. Т.ч. раздувать код убирая ветвления нужно очень осторожно, что-бы не вылезти из L1.
Исходная версия emulek, :
Каждый неправильно предсказанный джамп — полный перезапуск конвеера. Там, где сильно критична производительность арифметики, выкидывают все переходы насколько возможно.
предлагаешь запихать ветвление в макрос, и потом использовать его в каждой строчки по три раза?
На практике вычисление индекса и его последующее использование в вычислениях зачастую оказываются быстрее блока if else if.
на практике блок if else компилятор сам может выкинуть, и выкидывает. А вот если ты ветвление запихал в вычисление индекса, неявно, компилятор это ветвление выкинуть не может. Особенно НЕ радует ноль. Эдди дело говорит, у float нулей нет, это особый случай. Но ты ведь всё равно пихаешь дополнительное ветвление, на случай нуля, которого нет. И компилятор вынужден включать в код эту не нужную проверку.
И вообще, такие примитивные оптимизации известны не только тебе, но и разработчикам компилятора. Будет лучше, если ты займёшься алгоритмом, а не ветвлениями. С ветвлениями компилятор справится лучше тебя, т.к. знает целевой процессор, а ты — не знаешь (или ты одмин локалхоста?). С алгоритмом компилятор справится пока не в состоянии, и заниматься алгоритмом придётся тебе.