上次刷新时间: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