使用一千个板条箱将锈的编译时间从 30 分钟减少到 2 分钟

主要观点:

  • Rust 在运行时速度快,但编译时较慢,在处理复杂 SQL 编译时尤其明显,如一个 8562 行 SQL 编译成约 100k 行 Rust 代码需 25 - 45 分钟,编译时大部分时间花在 LLVM passes 和 codegen 且单线程,即使使用 64 核机器也未充分利用。
  • 通过将 SQL 编译成的 Rust 代码拆分成多个小 crate,使所有 CPU 能充分利用,编译时间降至 2 分 10 秒,如一个包含 1106 个 crate 的复杂 SQL 程序。
  • 虽已大幅提升编译速度,但仍存在一些神秘问题,如硬件资源竞争、文件系统瓶颈、多 crate 编译步骤重复或链接成为瓶颈等,目前编译时间仍比理论值慢 7 倍左右。

关键信息:

  • Feldera 让用户用 SQL 定义表和视图,将其编译为 Rust 代码并生成二进制。
  • 曾使用多种技巧加速编译,如类型擦除、代码去重等,但对大型复杂 SQL 效果有限。
  • 编译时通过 -Ztime-passes 可查看时间分布,大部分时间在 LLVM passes 和 codegen。
  • 拆分输出为多个小 crate 后,编译时间大幅减少,CPU 利用率提高。
  • 仍存在编译时间比理论值慢的问题,需进一步研究。

重要细节:

  • 展示了编译过程中 htop 的截图,显示单核心 100%占用,其他核心闲置,以及拆分 crate 后的忙碌状态。
  • 提到尝试增加 Cargo.toml 中的 codegen-units 但效果不明显,非 rustc 专家对此感到困惑。
  • 介绍了 Feldera 内部将 SQL 翻译成数据流图,每个操作符对应一个 crate,通过哈希作为 crate 名称,确保增量更改有效。
  • 展示了编译后生成的 1106 个 crate 的目录结构。
阅读 12
0 条评论