如何在 2025 年 3 月加快 Rust 编译器的速度

主要观点:自去年 3 月关于 Rust 编译器性能更新以来一年多,介绍了 Rust 编译器性能的多项改进及相关情况。
关键信息

  • 多项 PR 带来性能提升,如使用 lld 作为默认链接器、启用 PGO、升级 LLVM 版本、改变单态化工作方式、简化 slice::Iter::next 等,均使编译时间等指标有所降低。
  • 启动方面也有改进,如在 rustc_driver 中使用受保护可见性符号等,减少启动时的指令数。
  • 2024 - 03 - 04 至 2025 - 03 - 17 期间,整体性能有一定提升,包括编译时间减少、峰值内存使用略有增加、二进制大小变化不大等。
  • 作者今年希望致力于前端的增量编译和并行性以提升性能,且不久将更新 rustc - perf 基准测试套件。
    重要细节
  • [#124129]中 Remy Rakic 使 lld 成为 x86 - 64/Linux 夜间编译器的默认链接器,降低了多个基准测试的时间 30%或更多。
  • [#133807]中 Kajetan Puchalski 为 ARM64/Linux 启用了 PGO,使该平台上的大多数基准测试提速 10 - 20%。
  • [#127513]和[#135763]中 Nikita Popov 分别将编译器使用的 LLVM 版本升级到 LLVM 19 和 LLVM 20,使所有基准测试的平均墙时减少 1.33%和 0.78%。
  • [#132566]中 Ben Kimock 改变了单态化的工作方式,使所有基准测试的平均墙时减少 5.00%,部分超过 20%。
  • [#136771]中 scottmcm 简化 slice::Iter::next 使其可内联,使所有基准测试的平均周期减少 0.34%。
  • [#133793]中通过改变符号向量类型减少了语法错误生成的性能成本,在许多基准测试中获得 icount 胜利,最佳为 2.5%。
  • [#131481]中通过删除一个实际为悲观化的优化,使几个基准测试的指令计数减少不到 1%,代码缩短 500 多行。
  • [#131634]中 David Lattimore 在构建 rustc_driver 时使用受保护可见性符号,在 Linux 上减少约 10 - 1200 万条指令的启动时间,对于“hello world”的检查构建,icount 减少 31%。
  • [#137586]中消除了对每个特性的第二次检查,在最佳情况下使 icount 减少近 10%,该收益在 x86 和 x86 - 64 上的所有操作系统中都应可见,在其他架构上较小。
  • [LLVM #130936]中 Nikita Popov 对 LLVM 中的次优特性检查进行了相关更改,下次 LLVM 主要更新时“hello world”将再获得约 10%的 icount 胜利,且 SetImpliedBits 将不再影响短运行编译器调用的 Cachegrind 配置文件。
  • 整体性能测量在 Linux 上进行,编译时间平均减少 6.37%,峰值内存使用平均增加 2.87%,二进制大小平均减少 1.95%,多数变化在个位数。
阅读 2
0 条评论