Last Refreshed: 2019-09-03
Instructions for analyzing the binary size and composition of Rust programs on Fuchsia. The examples use the //src/diagnostics/archivist
package.
These instructions cover the installation and use of cargo-bloat, a tool for Rust projects inspired by Bloaty McBloatface.
To install:
cargo install cargo-bloat --features regex-filter [--force]
If you've installed a previous version or would like to add regex filtering support to an existing installation, you may need to add --force
.
This example uses cargo subcommands from crates.io, so you must install fargo.
fx build
Consult the fx common tools documentation for information about including the correct binary target in your build args.
Next, run fx build
within your Fuchsia source directory.
Follow the instructions to generate a Cargo.toml
for your project.
cargo-bloat
doesn‘t currently support passing an arbitrary manifest path, you’ll need to cd
to the directory with the generated Cargo.toml
:
cd $FUCHSIA_DIR/src/diagnostics/archivist
From that directory, ensure you can produce a release build with fargo:
fargo build --release
Run the release build from plain fargo first, as cargo-bloat will swallow any build errors.
Once we're sure that fargo can produce a release binary for our target, run 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
It's important to measure binary size in release, as it can be difficult to predict the impact of changes on debug builds.
The -n 5
arguments limit output to 5 lines. Run cargo bloat --help
for all options, and see below for several commonly used ones.
Use the --crates
flag to group bloat analysis by an estimate of the source 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.
Attributing generic functions to their originating crate is an error-prone heuristic analysis and you should drill down with filters and granular output to confirm any discoveries from crate-grouped output.
To drill down into the sources of bloat in a particular crate, you can filter by source crate name or regex over the function name (with the feature flag enabled) with the --filter
flag:
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