70 lines
3.1 KiB
Markdown
70 lines
3.1 KiB
Markdown
# Nx CLI Benchmarks
|
|
|
|
Synthetic workspace with 1110 projects arranged in a 3-level fan-out (10 groups x 10 subs x 10 leaves). Each project defines `build`, `copy`, and `cat` targets that operate on a shared `lorem.md` file — no real compilation, just enough I/O to exercise Nx's task pipeline.
|
|
|
|
## Workspace Targets
|
|
|
|
| Target | Command | Cached | Outputs | Dependencies |
|
|
| --------- | ---------------------------------- | ------ | ------- | ------------ |
|
|
| **build** | `cp lorem.md → dist/output.md` | Yes | Yes | `^build` |
|
|
| **copy** | `cp lorem.md → copy-out/output.md` | Yes | Yes | None |
|
|
| **cat** | `cat lorem.md` | Yes | No | None |
|
|
|
|
## Quick Start
|
|
|
|
Prerequisites: [hyperfine](https://github.com/sharkdp/hyperfine) (`cargo install hyperfine`)
|
|
|
|
```bash
|
|
# Run all benchmarks and compare against goals + baseline
|
|
pnpm nx run benchmarks
|
|
|
|
# Run a single benchmark
|
|
pnpm nx bench:version benchmarks
|
|
pnpm nx bench:show-projects benchmarks
|
|
pnpm nx bench:cat-warm benchmarks
|
|
pnpm nx bench:copy-warm benchmarks
|
|
```
|
|
|
|
Each `bench:*` target depends on `^build` so the Nx packages are compiled first.
|
|
|
|
## Benchmarks
|
|
|
|
| Benchmark | What it runs | What it measures |
|
|
| --------------- | ------------------------- | ------------------------------------------------------- |
|
|
| `version` | `nx --version` | CLI startup and module loading |
|
|
| `show-projects` | `nx show projects` | Project graph construction via daemon |
|
|
| `cat-warm` | `run-many -t cat` x1110 | Task scheduling + hashing with no output artifacts |
|
|
| `copy-warm` | `run-many -t copy` x1110 | Cached task execution with output tracking |
|
|
| `build-warm` | `run-many -t build` x1110 | Cached tasks with topological deps (currently disabled) |
|
|
|
|
All benchmarks use `NX_NO_CLOUD=true`, run `nx reset` before each iteration, and collect at least 5 runs (10 for `version`) via hyperfine.
|
|
|
|
## Goals and Baselines
|
|
|
|
Performance is tracked with two files:
|
|
|
|
- **`goals.json`** (committed) — target times the team agrees on. CI fails if a benchmark exceeds its goal.
|
|
- **`baseline.json`** (gitignored) — your local machine's numbers for personal comparison.
|
|
|
|
The `run-benchmarks.ts` script reads both and prints a table with colored deltas showing how the current run compares to each.
|
|
|
|
### Setting the Baseline
|
|
|
|
```bash
|
|
# First run auto-creates baseline.json
|
|
pnpm nx run benchmarks
|
|
|
|
# Explicitly overwrite with fresh numbers
|
|
pnpm nx run benchmarks -- --set-baseline
|
|
```
|
|
|
|
## How It Works
|
|
|
|
1. Each `bench:*` script invokes hyperfine and writes a `results-<name>.json` file.
|
|
2. The `run` target depends on all `bench:*` targets, so they execute in sequence (`parallelism: false`).
|
|
3. After all benchmarks finish, `run-benchmarks.ts` reads the result files and prints the comparison table.
|
|
|
|
## CI
|
|
|
|
Benchmarks run as part of the affected target pipeline in CI (`nx affected --targets=...bench`). The goals in `goals.json` act as the regression gate.
|