上次更新日期: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