Benchmarking and Profiling
Internal profiler
Cargo leverages tracing as a basic, hierarchical built-in profiler.
Environment variables:
CARGO_LOG_PROFILE=<true|1>
: log tracing events to a file in the current working directoryCARGO_LOG_PROFILE_CAPTURE_ARGS=<true|1>
: include arguments in the events
At process exit, your trace will be in a file like trace-1668480819035032.json
.
Open that file with ui.perfetto.dev (or chrome://tracing) to browse your trace.
Example:
$ # Output first three levels of profiling info
$ CARGO_LOG_PROFILE=true cargo generate-lockfile
Note: This is intended for the development of cargo and there are no compatibility guarantees on this functionality.
Benchmarking
Benchsuite
Head over to the benches
directory for more
information about the benchmarking suite.
Informal benchmarking
The overhead for starting a build should be kept as low as possible (preferably, well under 0.5 seconds on most projects and systems). Currently, the primary parts that affect this are:
- Running the resolver.
- Querying the index.
- Checking git dependencies.
- Scanning the local project.
- Building the unit dependency graph.
One way to test this is to use hyperfine. This is a tool that can be used to
measure the difference between different commands and settings. Usually this
is done by measuring the time it takes for cargo build
to finish in a large
project where the build is fresh (no actual compilation is performed). Just
run cargo build
once before using hyperfine.