LINUX.ORG.RU

История изменений

Исправление emulek, (текущая версия) :

Каждый неправильно предсказанный джамп — полный перезапуск конвеера. Там, где сильно критична производительность арифметики, выкидывают все переходы насколько возможно.

предлагаешь запихать ветвление в макрос, и потом использовать его в каждой строчки по три раза?

На практике вычисление индекса и его последующее использование в вычислениях зачастую оказываются быстрее блока if else if.

на практике блок if else компилятор сам может выкинуть, и выкидывает. А вот если ты ветвление запихал в вычисление индекса, неявно, компилятор это ветвление выкинуть не может. Особенно НЕ радует ноль. Эдди дело говорит, у float нулей нет, это особый случай. Но ты ведь всё равно пихаешь дополнительное ветвление, на случай нуля, которого нет. И компилятор вынужден включать в код эту не нужную проверку.

И вообще, такие примитивные оптимизации известны не только тебе, но и разработчикам компилятора. Будет лучше, если ты займёшься алгоритмом, а не ветвлениями. С ветвлениями компилятор справится лучше тебя, т.к. знает целевой процессор, а ты — не знаешь (или ты одмин локалхоста?). С алгоритмом компилятор справится пока не в состоянии, и заниматься алгоритмом придётся тебе.

ЗЫЖ «выкидывать переходы» тоже надо с умом. Многие переходы отлично предсказываются, и альтернативный вариант оказывается медленнее. Также надо помнить о том, что кеш L1 очень небольшой, и если код туда не влезет, производительность упадёт ниже плинтуса. Т.ч. раздувать код убирая ветвления нужно очень осторожно, что-бы не вылезти из L1.

Исходная версия emulek, :

Каждый неправильно предсказанный джамп — полный перезапуск конвеера. Там, где сильно критична производительность арифметики, выкидывают все переходы насколько возможно.

предлагаешь запихать ветвление в макрос, и потом использовать его в каждой строчки по три раза?

На практике вычисление индекса и его последующее использование в вычислениях зачастую оказываются быстрее блока if else if.

на практике блок if else компилятор сам может выкинуть, и выкидывает. А вот если ты ветвление запихал в вычисление индекса, неявно, компилятор это ветвление выкинуть не может. Особенно НЕ радует ноль. Эдди дело говорит, у float нулей нет, это особый случай. Но ты ведь всё равно пихаешь дополнительное ветвление, на случай нуля, которого нет. И компилятор вынужден включать в код эту не нужную проверку.

И вообще, такие примитивные оптимизации известны не только тебе, но и разработчикам компилятора. Будет лучше, если ты займёшься алгоритмом, а не ветвлениями. С ветвлениями компилятор справится лучше тебя, т.к. знает целевой процессор, а ты — не знаешь (или ты одмин локалхоста?). С алгоритмом компилятор справится пока не в состоянии, и заниматься алгоритмом придётся тебе.