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 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 (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.