Branchless Rust: Making a Filter 4x Faster by Removing an If2 months agohttps://www.greyblake.com/blog/branchless-rust/按阈值过滤数字切片时,性能随选择性变化,50%时最慢,因为分支预测错误。分支预测器猜测执行路径;不可预测的数据会导致预测错误,每次代价高昂(15-20个周期)。排序输入使分支可预测(快4.5倍),但排序并非实际可行的修复方法。无分支编程通过始终写入元素并将比较结果作为数字来条件推进游标,从而消除不可预测的分支。无分支代码运行时间恒定(约1毫秒),不受选择性影响,但在非常可预测的情况下(如保留1%)较慢。该技术应仅用于具有不可预测分支的热路径;牺牲可读性和最佳情况性能。
Your code is fast – if you're lucky3 months agohttps://tiki.li/blog/lucky_code.html现代编译器,特别是 Clang,在使用某些编程风格时,会通过无分支指令来优化循环。一个采用了排序网络和循环展开的快速排序实现,最初比 C++ 标准库的 std::sort 慢。将一段初学者友好的 if 语句改写为紧凑的 C 语言惯用法(使用后置递增运算符)显著提高了性能。这个“外观上”的改动触发 Clang 将分支替换为 csel(条件选择)指令,使代码变为无分支结构。在 x86 架构上,Clang 类似地使用 cmov 指令生成无分支代码,而 GCC 则始终生成较慢的基于分支的版本。优化后的快速排序比原始版本快了超过 6 倍,而且比 std::sort 也快了近一倍。