🚫 Убиваем
Самый быстрый
Иногда можно заменить ветвление на арифметику. Это гарантирует отсутствие Pipeline Flush, так как поток инструкций линейный.
Задача: Вернуть
С ветвлением:
Branchless (без ветвления):
В Rust
Но подождите!
Современные компиляторы часто делают это сами. Они превращают простой
Как проверить?
Смотрите в ассемблер (через
Совет: Пишите читаемый код. И только если профайлер показывает, что BPU захлебывается в горячем цикле - переписывайте на арифметику.
#rust #assembly #branchless #performance
👉 @rust_lib
if: Branchless ProgrammingСамый быстрый
if - это отсутствие if.Иногда можно заменить ветвление на арифметику. Это гарантирует отсутствие Pipeline Flush, так как поток инструкций линейный.
Задача: Вернуть
a, если condition true, и b, если false.С ветвлением:
let result = if condition { a } else { b };
// Генерирует инструкцию перехода (JMP/JNE) -> Риск misprediction
Branchless (без ветвления):
В Rust
bool можно скастить в u8 (true = 1, false = 0).
// (a * 1) + (b * 0) = a
// (a * 0) + (b * 1) = b
let result = a * (condition as i32) + b * (!condition as i32);
Но подождите!
Современные компиляторы часто делают это сами. Они превращают простой
if в инструкцию CMOV (Conditional Move). Это инструкция процессора: "Скопируй данные, если флаг выставлен". Это не ветвление, это просто копирование по условию.Как проверить?
Смотрите в ассемблер (через
godbolt или cargo-show-asm). Если видите cmov - поздравляю, у вас branchless код, и он будет работать быстро, даже если данные случайны. Если видите jle / jne - это прыжок.Совет: Пишите читаемый код. И только если профайлер показывает, что BPU захлебывается в горячем цикле - переписывайте на арифметику.
#rust #assembly #branchless #performance
👉 @rust_lib
👍14❤3🔥2✍1🥰1🤗1