Rust
2.23K subscribers
169 photos
106 videos
2 files
233 links
Полезный контент по программированию на Rust
Download Telegram
🚫 Убиваем 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
👍143🔥21🥰1🤗1