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%)较慢。该技术应仅用于具有不可预测分支的热路径;牺牲可读性和最佳情况性能。
Matt Godbolt's blog2 months agohttp://xania.org/202512/19-tail-call-optimisation?utm_source=feed&utm_medium=rss尾调用优化(TCO)通过将调用替换为跳转,将递归函数转化为循环,从而节省栈空间并实现进一步优化。Clang 的 [[clang::musttail]] 属性强制启用尾调用优化,确保即使在调试模式下也能优化尾调用。安排函数参数以匹配调用约定,通过减少寄存器重排来提高尾调用优化的效率。在CPU模拟器中,尾调用优化可以用独立的指令处理器替换switch循环,通过为每个处理器提供独立的分支预测状态来改善分支预测。
Quadrupling code performance with a "useless" if2 months agohttps://purplesyringa.moe/blog/quadrupling-code-performance-with-a-useless-if/描述了通过改进关键路径循环来优化特定领域压缩器的过程。强调了依赖链问题会阻碍指令级并行处理。提出利用分支预测来预测稳定值,以打破依赖链。建议使用易变类型转换技巧来防止编译器优化移除分支。提及了潜在的数据结构改进替代方案,但也指出了其中的权衡取舍。