测量 Rust 二进制膨胀

上次更新日期:2019 年 9 月 3 日

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

前提条件

货物膨胀

以下说明介绍了 cargo-bloat 的安装和使用,cargo-bloat 是一个受 Bloaty McBloatface 启发的 Rust 项目工具。

请按以下步骤安装:

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

如果您已安装先前版本,或者想要为现有安装添加正则表达式过滤支持,则可能需要添加 --force

法戈

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

运行 fx build

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

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

创建 Cargo.toml

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

使用 Fago 构建

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

cd $FUCHSIA_DIR/src/diagnostics/archivist

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

fargo build --release

首先从普通 Fago 中运行发布 build,因为货物膨胀会吞噬所有构建错误。

通过货物膨胀衡量尺寸的影响

确定 Fago 可以为目标生成发布二进制文件后,运行“cargo-bloat”:

fargo cargo bloat -- --release -n 5
Compiling ...
Analyzing .../src/../out/cargo_target/x86_64-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-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 分组的输出中发现的任何发现。

过滤函数

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

fargo cargo bloat -- --release -n 5 --filter regex_syntax
Compiling ...
Analyzing .../src/../out/cargo_target/x86_64-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