xtask/benchmark/README.md
Rust benchmark cases live in xtask/benchmark/cases and xtask/benchmark/stages.
The rspack_sources benchmarks live in their own rspack_sources benchmark
target so CodSpeed builds and runs them in a separate binary, isolated from the
allocator state left behind by the larger compilation benchmark suite.
Walltime-only bundle benchmarks follow the same pattern and live in the
separate walltime benchmark target.
Some benchmark cases use fixtures from .bench/rspack-benchcases. Prepare them before running the full benchmark suite or any bundle-related case:
pnpm run bench:prepare
The prepare step also creates a local threejs-10x fixture by copying the
upstream threejs/src input ten times. This larger input is registered only by
the isolated walltime benchmark target, so regular simulation runs keep using
the smaller default benchmark set. The threejs-10x walltime benchmark writes
outputs through the native filesystem instead of the in-memory filesystem used
by the regular bundle benchmarks. Rust benchmark concurrency is selected with
BENCH_MODE=simulation|walltime (default: simulation). Walltime bundle
benchmarks use BENCH_MODE=walltime, which caps machine-size-dependent
parallelism at up to 16 threads for each of Tokio workers, Tokio blocking tasks,
and Rayon.
The CI command runs cargo codspeed run directly:
pnpm run bench:rust
When this command is run outside a CodSpeed runner environment, cargo-codspeed may only check benchmarks and print Checked: entries instead of making CPU simulation measurements.
Use the build helper to run the same CodSpeed build command used by CI:
pnpm run build:bench
The script expands to:
cargo codspeed build -m simulation --profile codspeed -p rspack_benchmark --bench benches --bench rspack_sources
This only builds the benchmark binaries for CodSpeed simulation mode. It does not execute measurements. Both benchmark targets are selected in a single cargo codspeed build invocation so the later cargo codspeed run step can collect both benchmark suites.
To build only the isolated rspack_sources target:
pnpm run build:bench:rspack-sources
Use the local helper script to run benchmarks through the CodSpeed runner in CPU simulation mode:
pnpm run bench:rust:local
Pass a benchmark name filter after -- to run a single benchmark:
pnpm run bench:rust:local -- build_chunk_graph
To run only the isolated rspack_sources binary:
pnpm run bench:rust:local -- --bench rspack_sources
The script expands to:
mkdir -p /tmp/rspack-codspeed-valgrind-tmp && TMPDIR=/tmp/rspack-codspeed-valgrind-tmp MIMALLOC_PURGE_DELAY=-1 BENCH_MODE=simulation RSPACK_BENCHCASES_DIR=$PWD/.bench/rspack-benchcases codspeed run -m simulation -- cargo codspeed run -m simulation
This command:
TMPDIR so the temporary files are written to that directoryMIMALLOC_PURGE_DELAY=-1 to keep mimalloc delayed purging from calling clock_gettime during CPU simulation measurementsBENCH_MODE=simulation to match the single-threaded CI simulation environmentRSPACK_BENCHCASES_DIR to the prepared benchmark fixturescargo codspeed run -m simulation in codspeed run -m simulation so local runs use the CodSpeed runner environment instead of only checking benchmarksA real local simulation run prints Measured: entries. The script sets TMPDIR to /tmp/rspack-codspeed-valgrind-tmp, so CodSpeed and Valgrind temporary files are easy to inspect:
find /tmp/rspack-codspeed-valgrind-tmp -maxdepth 3 -type f
Typical files include profile.*.out/valgrind.log, profile.*.out/runner.log, and vgdb-pipe-* files.
Local CPU simulation requires:
cargo-codspeedcodspeedCheck the installed tools with:
cargo codspeed --version
codspeed --version
valgrind --version