我们的优化器需要重新思考

主要观点:编译器和数据库优化器有特定特点,现状存在矛盾,需改进以支持更好的调试、控制等。
关键信息

  • 优化器特点:具有 contingent criticality(在某些情境下至关重要且容错率低)、limited control(控制旋钮有限)、limited testability(检查输出的设施有限)、limited visibility(有时看似“有自己的想法”)。
  • 现状矛盾:优化器关键但其他方面控制等不足。
  • 改进方向:

    • 帮助用户建立心理模型:有清晰优化文档及正负例,解释未触发优化原因及引导方法。
    • 进化调试工具:借鉴 LLVM 的 Optimization Remarks 等,集成到编辑器扩展,方便用户分享报告。
    • 提供强指导而非提示:避免优化器默默忽略,可通过语义分析等实现,不同情况可灵活处理。
    • 建立优化器回归测试基础设施:针对不同情况设计测试,解决纯编译时和运行时优化的测试问题。

    重要细节

  • Rust 有black_box内在函数用于优化调试;许多语言有标记内联信息的方式;MySQL 有optimizer hints
  • LLVM 支持Optimization Remarks;Clang 用[-fsave-optimization-record]支持记录,Rustc 支持[-Zremark-dir=<blah>];Swift 有SIL optimization remarks
  • 不同语言在优化与调试方面的特点,如 D 的“no GC”支持、C#的ref参数等;Go 没有传统的开发和发布构建分离。
  • 不同文章对 Proebsting’s Law 的研究及结论。
阅读 22
0 条评论