Пост канала
🚫 Убиваем 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
Открыть в MAX- Просмотры
- 381
- ER
- 2,4%
- Реакции
- 9