测量 Rust 二进制膨胀

上次刷新时间:2019 年 9 月 3 日

有关在 Fuchsia 上分析 Rust 程序的二进制文件大小和组成部分的说明。示例 请使用 //src/diagnostics/archivist 软件包。

前提条件

货物膨胀

这些说明介绍了 cargo-bloat(一种适用于 Rust 项目的工具)的安装和使用方法 灵感来自 Bloaty McBloatface

请按以下步骤安装:

cargo install cargo-bloat --features regex-filter [--force]

您安装的是以前的版本或想要为现有的版本添加正则表达式过滤支持 安装,可能需要添加 --force

Fargo

本示例使用 crates.io 中的 cargo 子命令,因此您必须安装 Fargo

运行 fx build

请参阅 fx 常用工具文档,了解如何添加 build 参数中正确的二进制目标。

接下来,在您的 Fuchsia 源目录中运行 fx build

创建 Cargo.toml

按照说明为项目生成 Cargo.toml

使用 Fargo 进行构建

cargo-bloat 目前不支持传递任意清单路径,您需要 cd 才能 包含生成的 Cargo.toml 的目录:

cd $FUCHSIA_DIR/src/diagnostics/archivist

从该目录,确保您可以使用 Fago 生成发布 build:

fargo build --release

先从普通位置运行发布 build,因为 cargo-bloat 会消掉所有构建错误。

通过货物膨胀来衡量大小贡献

一旦我们确定 Fargo 可以为目标生成发布二进制文件,就运行 cargo-bloat:

fargo cargo bloat -- --release -n 5
Compiling ...
Analyzing .../src/../out/cargo_target/x86_64-unknown-fuchsia/release/archivist

 File  .text     Size              Crate Name
 1.7%   4.5%  38.0KiB              regex <regex::exec::ExecNoSync as regex::re_trait::Regular...
 1.0%   2.5%  21.4KiB       regex_syntax regex_syntax::ast::parse::ParserI<P>::parse_with_comments
 0.8%   2.1%  17.7KiB fuchsia_component? <fuchsia_component::server::ServiceFs<ServiceObjTy> as...
 0.4%   0.9%   8.0KiB              regex regex::re_unicode::Regex::shortest_match_at
 0.4%   0.9%   7.8KiB                std _ZN9libunwind10CFI_ParserINS_17LocalAddressSpaceEE17paI...
33.8%  89.0% 751.9KiB                    And 6152 smaller methods. Use -n N to show more.
38.0% 100.0% 844.8KiB                    .text section size, the file size is 2.2MiB

衡量发布版本中的二进制文件大小非常重要,因为很难预测 调试 build 的相关变更

-n 5 参数会将输出内容限制为 5 行。针对所有选项运行 cargo bloat --help,并查看 下面介绍了几种常用的方法

按 crate 对函数进行分组

使用 --crates 标志按源 crate 的估算值对膨胀分析进行分组:

fargo cargo bloat -- --release -n 5 --crates
Compiling ...
Analyzing .../src/../out/cargo_target/x86_64-unknown-fuchsia/release/archivist

 File  .text     Size Crate
13.3%  34.9% 294.8KiB std
 6.3%  16.7% 141.0KiB regex
 5.0%  13.2% 111.3KiB regex_syntax
 2.1%   5.5%  46.1KiB fidl
 1.8%   4.7%  39.5KiB json5
 9.6%  25.1% 212.2KiB And 64 more crates. Use -n N to show more.
38.0% 100.0% 844.8KiB .text section size, the file size is 2.2MiB

Note: numbers above are a result of guesswork. They are not 100% correct and never will be.

将泛型函数归因于其原始 crate 是一种容易出错的启发式分析, 您应使用过滤条件和精细的输出进行深入研究,确认从 crate-grouped 中发现的任何 输出。

过滤函数

如需深入了解特定 crate 中膨胀的来源,您可以按源代码 crate 名称进行过滤 或使用 --filter 标志替换函数名称(已启用功能标志)的正则表达式:

fargo cargo bloat -- --release -n 5 --filter regex_syntax
Compiling ...
Analyzing .../src/../out/cargo_target/x86_64-unknown-fuchsia/release/archivist

File .text     Size        Crate Name
1.0%  2.5%  21.4KiB regex_syntax regex_syntax::ast::parse::ParserI<P>::parse_with_comments
0.3%  0.8%   6.4KiB regex_syntax regex_syntax::ast::parse::ParserI<P>::parse_escape
0.2%  0.5%   3.8KiB regex_syntax <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast...
0.1%  0.2%   1.8KiB regex_syntax <regex_syntax::hir::translate::TranslatorI as regex_syntax::ast...
0.1%  0.2%   1.7KiB regex_syntax regex_syntax::unicode::class
3.4%  9.0%  76.2KiB              And 698 smaller methods. Use -n N to show more.
5.0% 13.2% 111.2KiB              filtered data size, the file size is 2.2MiB