Hasty Briefsbeta

双语

When O3 is 2x slower than O2

7 months ago
  • #Optimization
  • #Rust
  • #Performance
  • 文章讨论了在优化Rust自定义有界优先级队列时出现的性能回退问题,具体表现为将优化等级从`opt-level=2`提升至`opt-level=3`后性能反而下降。
  • 基准测试显示,与`opt-level=2`相比,`opt-level=3`会导致性能下降123%。
  • 该队列采用基于排序的`Vec`结构配合二分查找进行插入操作,性能问题最终追溯到比较函数在不同优化等级下的行为差异。
  • 火焰图分析表明,在`opt-level=3`下`binary_search_by`和比较函数消耗的CPU时间显著增加。
  • 汇编代码检查发现,`opt-level=3`将条件跳转替换为条件移动指令——理论上应该更快,但实际上由于依赖瓶颈导致性能劣化。
  • 测试替代比较函数(如使用`f32::total_cmp`)后,`opt-level=3`下的性能仍然较慢。
  • 对`binary_search_by`进行改造的实验(例如添加`hint::black_box`或替换`hint::select_unpredictable`)结果参差不齐,有时能提升性能但缺乏一致性。
  • 从Rust问题追踪器的历史记录来看,条件移动指令本是为提升特定场景性能引入,但实际可能在其他场景造成性能回退。
  • 文章最终指出基准测试具有复杂性,性能表现会因具体用例和优化策略的不同而产生巨大差异。