blob: f8410291b138d0172efe23efc2f757a634b7d667 [file] [view] [edit]
# Benchmarking and Profiling
## Internal profiler
Cargo leverages [tracing](https://crates.io/crates/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 directory
- `CARGO_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](https://ui.perfetto.dev) (or chrome://tracing) to browse your trace.
Example:
```console
$ # 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](https://github.com/rust-lang/cargo/tree/master/benches) 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.
[hyperfine]: https://github.com/sharkdp/hyperfine