博客
使用 PGO 优化 Databend 二进制构建
PsiACE2月 24, 2023
在最近的一个 Issue 中 (#9387),Databend 社区的朋友希望能够利用 PGO 技术构建性能优化的可执行文件。让我们一起来看一下如何使用 Rust 构建 PGO 优化后的 Databend 吧!
背景知识
Profile-guided optimization 是一种编译器优化技术,它会收集程序运行过程中的典型执行数据(可能执行的分支),然后针对内联、条件分支、机器代码布局、寄存器分配等进行优化。
引入这一技术的背景是:编译器中的静态分析技术能够在不执行代码的情况下考虑代码优化,从而提高编译产物的性能;但是这些优化并不一定能够完全有效,在缺乏运行时信息的情况下,编译器无法考虑到程序的实际执行情况。
PGO 可以基于应用程序在生产环境中的场景收集数据,从而允许优化器针对较热的代码路径优化速度并针对较冷的代码路径优化大小,为应用程序生成更快和更小的代码。
rustc 支持 PGO,允许创建内置数据收集的二进制文件,然后在运行过程中收集数据,从而为最终的编译优化做准备。其实现完全依赖 LLVM。
典型过程
构建 PGO 优化的二进制文件通常需要进行以下几步工作:
- 构建内置数据收集的二进制文件
- 运行并收集数据,数据会以 的形式存在
.proraw
- 将 文件转换为
.proraw
文件.prodata
- 根据 文件进行构建优化
.prodata
前置准备
运行过程中的收集到的数据最终需要使用
llvm-profdata
rustup
llvm-tools-preview