
Rust 编译器性能剖析实战用./x perf集成 rustc-perf 基准套件【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust本文围绕 rustc-dev-guide 中 Profiling with rustc-perf 一文展开讲解如何借助编译器构建系统bootstrap内置的./x perf命令一键下载、构建 rustc-perf 基准套件与本地编译器工具链并完成基准测试、结果对比、stderr捕获、samply 采样剖析与 Cachegrind 模拟剖析。读完本文你将掌握完整的 rustc 性能剖析命令行工作流以及为外部 crate 生成两个提交间性能差异profile diff的实操方法。rustc-perf剖析 rustc 的基准测试套件Rust 编译器rustc的性能优化高度依赖可复现的基准测试。rustc-perf项目提供了一套全面的编译基准benchmark suite覆盖常见的真实世界 crate并支持多种剖析方式基准测试benchmarking在本地构建的编译器上运行编译基准记录耗时等指标采样剖析sampling profiling借助 samply 采样剖析器观察编译器运行时的调用栈与热点模拟剖析simulated profiling借助 CachegrindValgrind 家族生成编译器执行过程的详细模拟轨迹分析缓存行为与指令数。单独使用这套套件需要手动 clone、构建并传参流程较为繁琐。为此rustc 仓库的 bootstrap 构建系统内置了对它的集成这正是本文的核心主题。./x perfbootstrap 内置的集成入口编译器构建系统bootstrap将 rustc-perf 作为 git submodule 挂在 src/tools/rustc-perf并提供统一的子命令./x perf。在 flags.rs 中可以看到该子命令的注册说明Perform profiling and benchmarking of the compiler usingrustc-perf.调用形式为./x perf command [options]从 builder/mod.rs 的Kind枚举可以看出perf属于独立的命令类别Kind::Perf perf描述为Profiling benchmarking因此也可以写作./x.py perfLinux/macOS 下./x是指向x.py的脚本。底层做了什么执行./x perf时bootstrap 会依次完成以下工作对应 perf.rs 的实现确保src/tools/rustc-perfsubmodule 已初始化并构建其中的collector二进制参见 tool.rsRustcPerf步骤专门为collector包执行cargo build -p collector并把rustc-fake符号链接到相同目录因为 collector 依赖它在临时目录中创建rustc-perf/results结果目录以 src/tools/rustc-perf 为工作目录启动 collector使其能定位编译基准构建当前 stage 的编译器、标准库若选择的 profiles 中包含Doc还会构建 rustdoc与 sysroot作为被测对象把x perf的参数翻译成 collector 自身的profile_local/bench_local/bench_cmp命令执行。也就是说x perf本质上是对 rustc-perf 套件中profile_local与bench_local两条命令的薄封装为你省去了手动构建 collector、拼接 sysroot 路径等琐事。常用 bootstrap 参数x perf支持常规 bootstrap 标志例如--stage 1/--stage 2修改被测编译器构建阶段sysroot 的构建阶段--host、--target等其他通用标志同样可用。更重要的建议是配置bootstrap.toml以配合剖析# config.toml (由 ./x setup 生成) 中 [rust] debuginfo-level 1在 perf.rs 中bootstrap 会在检测到 rustc 自身没有调试信息rust.debuginfo-level-rustc为 None时打印警告WARNING: You are compiling rustc without debuginfo, this will make profiling less useful. Consider settingrust.debuginfo-level 1inbootstrap.toml.因为采样剖析samply、Cachegrind依赖调试信息来还原源码行号与符号debuginfo-level 1仅行号信息能在不显著拖慢构建的前提下让剖析结果可读。该配置项在 toml/rust.rs 中还有更细粒度的变体debuginfo-level-rustc、debuginfo-level-std、debuginfo-level-tools、debuginfo-level-tests可分别控制编译器本体与标准库等的调试信息级别。子命令与选项速查./x perf当前支持以下子命令与 perf.rs 中PerfCommand枚举一一对应子命令作用底层 collector 命令benchmark id对编译器执行编译基准测试结果以id为标识存储bench_local --id idcompare baseline modified对比两个id对应的基准结果bench_cmp base modifiedeprintln只运行编译器并捕获其stderr输出profile_local eprintlnsamply使用 samply 采样剖析器剖析编译器profile_local samplycachegrind使用 Cachegrind 生成编译器执行过程的详细模拟轨迹profile_local cachegrind两点注意eprintln的输出默认是空的——编译器正常情况不会向stderr打印任何内容。若要观察输出需要先在 rustc 源码中自行添加eprintln!宏调用再运行该子命令。samply与cachegrind需要预先安装相应工具samply 可通过cargo install --locked samply安装见 perf.rs 的注释Cachegrind 由 Valgrind 提供。共享选项以下选项镜像了套件中profile_local/bench_local命令的对应参数见 perf.rs 中SharedOpts的定义作用于benchmark、eprintln、samply、cachegrind四个子命令选项作用默认值--include benchmarks选择要剖析/基准测试的基准逗号分隔不指定则运行全部全部--exclude benchmarks排除指定前缀的基准逗号分隔与--include互补无--profiles profiles选择要运行的剖析档案profileCheck,Debug,Opt--scenarios scenarios选择要运行的场景scenarioFull,IncrFull,IncrUnchanged,IncrPatched从源码的Profile与Scenario枚举perf.rs看profile 可取Check、Debug、Doc、DocJson、Opt、Clippyscenario 可取Full、IncrFull、IncrUnchanged、IncrPatched分别对应完整编译、增量编译全量改动/部分改动/无改动等典型场景。一个典型调用示例# 对 serde_derive 基准执行 Check 档案、IncrUnchanged 场景的基准测试 ./x perf benchmark my-id --include serde_derive --profiles Check --scenarios IncrUnchanged基准测试结果会写入数据库文件bootstrap 位于临时目录results/results.db随后可用compare子命令做对比./x perf compare baseline-id modified-id底层分别对应bench_local --db db --id id与bench_cmp --db db base modified见 perf.rs。实例为外部 crate 生成两个提交间的性能差异有时你关心的不是编译器自带的基准而是某个特定外部 crate 在两个 rustc 提交间的编译性能差异。rustc-perf 套件为此提供了直接的命令行支持流程如下。第 1 步在 rustc-perf 仓库中构建 collectorrustc-perf 以 submodule 形式存在于 src/tools/rustc-perf执行x perf时 bootstrap 会自动初始化并构建它。若你希望手动进入该仓库操作先确保 submodule 已初始化然后在其中构建 collectorcargo build --release -p collector第 2 步运行 collector 生成 profile diffcollector 的profile_local命令接收以下参数PROFILE性能测量方式剖析器选择。本文示例使用 CachegrindRUSTC要基准测试的编译器修订版本以rust-lang/rust仓库的提交 SHA 表示形如SHA可选参数用于指定 profiles、scenarios 等含义与x perf中的共享选项一致。例如为 crateserde_derive-1.0.136对比SHA1与SHA2两个提交仅 Check 档案、IncrUnchanged 场景在 rustc-perf 仓库中执行cargo run --release --bin collector profile_local cachegrind SHA1 --rustc2 SHA2 --exact-match serde_derive-1.0.136 --profiles Check --scenarios IncrUnchanged参数拆解profile_local在本地构建的编译器上运行剖析的命令cachegrind性能测量方式为 Cachegrind 模拟剖析SHA1第一个 rustc 修订基准--rustc2 SHA2第二个 rustc 修订对比对象--exact-match serde_derive-1.0.136精确定位该 crate 的基准不带--exact-match时可用--include指定前缀匹配--profiles Check仅执行 Check 档案cargo check类负载不含代码生成--scenarios IncrUnchanged仅执行增量编译且无改动的场景。命令结束后你可以直接比较两次 Cachegrind 模拟结果中的指令数Ir等指标从而量化两个 rustc 提交对同一外部 crate 的编译性能影响。这种精确到单个 crate、单个场景的对比是回归分析与优化验收的常用手段。进一步阅读剖析器的更详细描述见 rustc-perf 套件的手册collector包的 README 中的 Profiling local builds 一节rustc-perf 作为 submodule 位于 src/tools/rustc-perf其 collector 相关代码与说明可在初始化 submodule 后于该目录查看。x perf的完整参数定义含--include、--exclude的逗号分隔语法见 perf.rscollector 工具的构建细节见 tool.rs。若要剖析的具体是编译器的某项内部指标还可参考本目录下 with-perf.mdLinuxperf剖析器与 wpa-profiling.mdWindows Performance Analyzer它们与本篇形成互补的剖析工具链。从一键运行到逐 crate 对比./x perf把 rustc 性能剖析的成本降到了最低先确保bootstrap.toml中设置了debuginfo-level 1再按需选用benchmark、compare、eprintln、samply或cachegrind子命令即可快速定位编译器性能热点或验证某个改动是否真正带来了编译性能收益。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考