你的代码很快——如果运气够好

Your code is fast – if you're lucky

最近在优化 Quicksort 实现时,我发现了一个有趣的细节:现代编译器(尤其是 Clang)只有在代码风格符合特定要求时,才会生成高效的无分支指令。我通过引入排序网络和循环展开,将 5000 万个 double 类型的排序时间从 4.39 秒优化到了接近 C++ std::sort 的 1.33 秒。但这并非终点,仅仅将指针移动逻辑从冗长的显式写法改为更紧凑的 C 语言惯用写法,就能触发编译器更激进的优化。代码的性能往往不取决于算法本身,而取决于你是否“幸运”地写出了能让编译器发挥最大威力的代码风格。

你的代码运行速度很快——但这完全取决于你的运气。
  • 有评论者指出 Clang 优化器对代码写法极其敏感,单行与多行写法虽语义相同,却因 LLVM IR 中指令顺序差异导致 SimplifyCFG 无法生成无分支代码。
  • 一位从业者分享反直觉经验,在某些排序算法场景下,放弃无分支的 cmov 指令改用传统分支指令反而使代码性能提升了 30%。
  • 针对 C 语言中 *ptr++ 这种常见惯用法的可读性,评论区内存在明显分歧,一方认为显式括号能明确运算符优先级,另一方则坚持该写法本身已足够清晰。
  • 有观点强调现代 CPU 对 conditional moves 同样能进行预测和推测执行,且误判成本远低于传统分支,因为无需等待指令获取。
  • 开发者反思当前编程语言难以兼顾“编写便捷”与“运行高效”,认为理想方案应是允许开发者根据需求在原型阶段与性能优化阶段灵活切换抽象层级。

同日更多故事

2026-07-11