Skip to content

Latest commit

 

History

History
551 lines (450 loc) · 31 KB

File metadata and controls

551 lines (450 loc) · 31 KB

alint perf history

Per-scenario tables, version-trajectory shape. Headline cells fingerprinted to linux-x86_64 (Intel Core i7-6700HQ 4-core / 15 GB / ext4 / rustc 1.97.0) — see METHODOLOGY.md for the hardware contract and why cross-machine comparisons need like-for-like.

How to read this file

Each scenario gets its own section with:

  1. A one-paragraph overview of what dispatch shape the scenario stresses and which class of regression it catches.
  2. A table per mode (full and changed) with rows = version (newest first), columns = size (1k / 10k / 100k / 1M). Cells are mean ± stddev, formatted in ms below 1 s and seconds above.
  3. means the version was not measured at that size. n/a means the scenario didn't exist at the tag.

Significant deltas (anything > 20 % across a release) get an investigation write-up under investigations/<YYYY-MM-topic>/ that captures the diagnostic data (traces, flamegraphs, bisect notes).

Source of truth. This file is generated by xtask/scripts/render-history.py after every release. The bench-record.yml workflow's PR includes the per-cell numbers for the maintainer to verify before merging — see ../../RELEASING.md.

Cross-version headline trajectory

1M cells across the most-stressed scenarios. S3 is the realistic-monorepo anchor; S7 is the cross-file-relational cliff that v0.9.5's path-index fix didn't fully cover (and v0.9.8 targets directly); S9 is the nested-polyglot scenario the v0.9.6 scope_filter: primitive exists for.

Version Date 1M S3 full 1M S6 full 1M S7 full 1M S9 full Headline change
v0.15.0 2026-08-16 18.11 s ± 0.14 17.60 s ± 0.21 16.06 s ± 0.19 11.97 s ± 0.32 v0.15 makes rules legible and monorepos first-class.
v0.14.2 2026-08-06 18.33 s ± 0.15 17.35 s ± 0.02 16.19 s ± 0.23 11.87 s ± 0.09 A fixes-and-hardening patch on top of 0.14.1.
v0.14.1 2026-07-24 18.02 s ± 0.14 17.27 s ± 0.08 16.24 s ± 0.17 11.77 s ± 0.03 A performance patch.
v0.14.0 2026-07-18 18.63 s ± 0.16 17.86 s ± 0.01 16.24 s ± 0.13 12.20 s ± 0.06 The adoption release. Baseline mode (alint baseline + alint check --baseline) grandfathers a repo's existing violations behind a content-fingerprinted snapshot, so alint check reports and gates only on new findings — alint becomes a blocking merge gate on an established codebase without a flag-day cleanup, and for SARIF the suppressed findings are marked, not deleted, so GitHub Code Scanning dismisses them instead of flapping fixed-then-reopened.
v0.13.0 2026-06-17 17.64 s ± 0.11 16.66 s ± 0.02 16.26 s ± 0.17 11.36 s ± 0.01 This release turns the documented surface into generated, drift-proof contracts.
v0.12.0 2026-06-07 17.52 s ± 0.14 16.71 s ± 0.02 16.13 s ± 0.29 11.48 s ± 0.04 The case-study-driven rule-kind expansion, paired with a security cycle that hardens path handling into a real boundary.
v0.11.0 2026-05-28 17.57 s ± 0.07 16.74 s ± 0.10 16.29 s ± 0.11 11.49 s ± 0.05 The LSP + editor-integration release.
v0.10.2 2026-05-21 17.50 s ± 0.02 16.62 s ± 0.02 16.33 s ± 0.03 11.42 s ± 0.05 Targeted follow-up to v0.10.1.
v0.10.1 2026-05-20 17.49 s ± 0.27 16.62 s ± 0.02 16.25 s ± 0.17 11.46 s ± 0.07 Small post-release follow-up to v0.10.0.
v0.10.0 2026-05-20 17.64 s ± 0.03 16.70 s ± 0.02 16.35 s ± 0.14 11.42 s ± 0.03 The "case-study coverage push" minor.

Earlier history (v0.7.x, v0.8.x): no measured perf change beyond v0.5.7; see CHANGELOG.md for the contemporaneous notes.


S1 — Filename hygiene

Eight filename-only rules (filename_case, filename_regex). Pure walker plus glob match — no content read. Narrowest scope alint shares with ls-lint, used as the competitive-comparison anchor. Catches walker and scope-match regressions.

S1 — full

Version 1k 10k 100k 1M
v0.15.0 7 ms ± 1 26 ms ± 1 220 ms ± 1 2.36 s ± 0.00
v0.14.2 8 ms ± 1 27 ms ± 1 222 ms ± 2 2.41 s ± 0.06
v0.14.1 8 ms ± 1 27 ms ± 1 224 ms ± 4 2.38 s ± 0.01
v0.14.0 8 ms ± 1 26 ms ± 1 224 ms ± 1 2.39 s ± 0.00
v0.13.0 8 ms ± 1 26 ms ± 1 223 ms ± 1 2.39 s ± 0.00
v0.12.0 8 ms ± 1 27 ms ± 2 223 ms ± 1 2.39 s ± 0.00
v0.11.0 8 ms ± 1 26 ms ± 1 221 ms ± 1 2.37 s ± 0.01
v0.10.2 7 ms ± 1 26 ms ± 1 223 ms ± 2 2.39 s ± 0.01
v0.10.1 7 ms ± 1 27 ms ± 1 223 ms ± 1 2.40 s ± 0.01
v0.10.0 7 ms ± 1 27 ms ± 1 223 ms ± 2 2.40 s ± 0.01

S1 — changed

Version 1k 10k 100k 1M
v0.15.0 12 ms ± 1 46 ms ± 2 389 ms ± 3 4.12 s ± 0.01
v0.14.2 19 ms ± 1 46 ms ± 1 391 ms ± 4 4.16 s ± 0.01
v0.14.1 19 ms ± 1 47 ms ± 1 393 ms ± 4 4.16 s ± 0.00
v0.14.0 19 ms ± 1 46 ms ± 1 393 ms ± 3 4.17 s ± 0.02
v0.13.0 19 ms ± 1 46 ms ± 1 390 ms ± 2 4.17 s ± 0.01
v0.12.0 19 ms ± 1 46 ms ± 1 391 ms ± 2 4.15 s ± 0.00
v0.11.0 11 ms ± 1 46 ms ± 1 391 ms ± 2 4.16 s ± 0.01
v0.10.2 19 ms ± 1 46 ms ± 1 393 ms ± 3 4.18 s ± 0.00
v0.10.1 19 ms ± 1 65 ms ± 1 393 ms ± 2 4.16 s ± 0.01
v0.10.0 19 ms ± 1 46 ms ± 1 392 ms ± 2 4.18 s ± 0.01

S2 — Existence + content

Eight existence + content rules (file_exists, file_absent, file_content_forbidden, file_max_size). Walker plus per-file content scan over narrow scopes. Repolinter-comparable shape. Catches content-rule regressions on common shapes.

S2 — full

Version 1k 10k 100k 1M
v0.15.0 10 ms ± 1 37 ms ± 1 320 ms ± 5 3.56 s ± 0.01
v0.14.2 10 ms ± 1 37 ms ± 1 319 ms ± 5 3.58 s ± 0.01
v0.14.1 10 ms ± 1 37 ms ± 2 324 ms ± 5 3.56 s ± 0.02
v0.14.0 10 ms ± 1 42 ms ± 1 374 ms ± 3 4.14 s ± 0.02
v0.13.0 10 ms ± 1 38 ms ± 1 327 ms ± 5 3.68 s ± 0.04
v0.12.0 11 ms ± 1 37 ms ± 1 325 ms ± 4 3.66 s ± 0.03
v0.11.0 10 ms ± 1 37 ms ± 1 323 ms ± 5 3.65 s ± 0.00
v0.10.2 11 ms ± 1 37 ms ± 1 325 ms ± 4 3.68 s ± 0.01
v0.10.1 10 ms ± 1 37 ms ± 1 324 ms ± 2 3.66 s ± 0.01
v0.10.0 10 ms ± 1 38 ms ± 2 329 ms ± 3 3.67 s ± 0.02

S2 — changed

Version 1k 10k 100k 1M
v0.15.0 14 ms ± 1 48 ms ± 1 397 ms ± 2 4.21 s ± 0.01
v0.14.2 20 ms ± 1 48 ms ± 1 399 ms ± 1 4.24 s ± 0.01
v0.14.1 20 ms ± 1 49 ms ± 1 409 ms ± 7 4.24 s ± 0.01
v0.14.0 20 ms ± 1 49 ms ± 1 407 ms ± 2 4.29 s ± 0.01
v0.13.0 21 ms ± 1 49 ms ± 1 401 ms ± 2 4.26 s ± 0.01
v0.12.0 20 ms ± 1 48 ms ± 1 401 ms ± 2 4.23 s ± 0.01
v0.11.0 12 ms ± 1 48 ms ± 1 400 ms ± 2 4.23 s ± 0.01
v0.10.2 20 ms ± 1 48 ms ± 1 400 ms ± 1 4.25 s ± 0.00
v0.10.1 20 ms ± 1 66 ms ± 1 402 ms ± 2 4.25 s ± 0.02
v0.10.0 20 ms ± 1 48 ms ± 1 403 ms ± 2 4.26 s ± 0.00

S3 — Workspace bundle

extends: oss-baseline + rust + monorepo + cargo-workspace (~34 rules). Heavy mix — content rules over **/*.rs, cross-file for_each_dir over crates/*, toml_path_matches per crate. Realistic monorepo workload; the v0.9.5 cliff (investigations/2026-05-cross-file-rules/) lived here.

S3 — full

Version 1k 10k 100k 1M
v0.15.0 32 ms ± 2 179 ms ± 2 1.71 s ± 0.01 18.11 s ± 0.14
v0.14.2 31 ms ± 1 180 ms ± 2 1.70 s ± 0.01 18.33 s ± 0.15
v0.14.1 32 ms ± 2 182 ms ± 5 1.74 s ± 0.05 18.02 s ± 0.14
v0.14.0 32 ms ± 1 185 ms ± 2 1.75 s ± 0.01 18.63 s ± 0.16
v0.13.0 31 ms ± 1 173 ms ± 2 1.64 s ± 0.01 17.64 s ± 0.11
v0.12.0 31 ms ± 1 173 ms ± 2 1.65 s ± 0.01 17.52 s ± 0.14
v0.11.0 30 ms ± 1 173 ms ± 2 1.64 s ± 0.01 17.57 s ± 0.07
v0.10.2 31 ms ± 2 172 ms ± 2 1.64 s ± 0.00 17.50 s ± 0.02
v0.10.1 30 ms ± 1 172 ms ± 2 1.64 s ± 0.01 17.49 s ± 0.27
v0.10.0 31 ms ± 2 171 ms ± 3 1.64 s ± 0.01 17.64 s ± 0.03

S3 — changed

Version 1k 10k 100k 1M
v0.15.0 26 ms ± 2 95 ms ± 1 721 ms ± 5 7.50 s ± 0.03
v0.14.2 33 ms ± 1 95 ms ± 2 722 ms ± 4 7.54 s ± 0.05
v0.14.1 33 ms ± 1 97 ms ± 2 737 ms ± 8 7.55 s ± 0.02
v0.14.0 34 ms ± 1 97 ms ± 1 726 ms ± 3 7.57 s ± 0.02
v0.13.0 34 ms ± 2 95 ms ± 2 726 ms ± 5 7.59 s ± 0.03
v0.12.0 33 ms ± 1 95 ms ± 1 724 ms ± 3 7.53 s ± 0.02
v0.11.0 25 ms ± 1 95 ms ± 2 724 ms ± 4 7.54 s ± 0.00
v0.10.2 33 ms ± 2 95 ms ± 1 726 ms ± 4 7.58 s ± 0.02
v0.10.1 33 ms ± 2 114 ms ± 1 726 ms ± 3 7.57 s ± 0.05
v0.10.0 34 ms ± 1 95 ms ± 2 726 ms ± 3 7.60 s ± 0.04

S4 — Agent-era hygiene

Five rules from the v0.6 agent-hygiene bundled ruleset (file_absent, file_content_forbidden). Filename plus content fan-out over agent-shaped trees. Catches agent-era rule shapes.

S4 — full

Version 1k 10k 100k 1M
v0.15.0 9 ms ± 1 27 ms ± 1 227 ms ± 4 2.38 s ± 0.01
v0.14.2 8 ms ± 0 28 ms ± 1 227 ms ± 4 2.40 s ± 0.01
v0.14.1 9 ms ± 1 29 ms ± 1 230 ms ± 5 2.41 s ± 0.01
v0.14.0 10 ms ± 1 28 ms ± 1 231 ms ± 4 2.41 s ± 0.00
v0.13.0 9 ms ± 1 28 ms ± 1 229 ms ± 4 2.41 s ± 0.01
v0.12.0 9 ms ± 1 28 ms ± 1 229 ms ± 5 2.41 s ± 0.01
v0.11.0 9 ms ± 1 28 ms ± 1 226 ms ± 3 2.39 s ± 0.01
v0.10.2 9 ms ± 1 28 ms ± 1 227 ms ± 3 2.41 s ± 0.01
v0.10.1 9 ms ± 1 28 ms ± 1 231 ms ± 5 2.41 s ± 0.01
v0.10.0 9 ms ± 1 28 ms ± 1 229 ms ± 3 2.42 s ± 0.01

S4 — changed

Version 1k 10k 100k 1M
v0.15.0 14 ms ± 1 47 ms ± 1 390 ms ± 2 4.12 s ± 0.00
v0.14.2 20 ms ± 1 47 ms ± 1 391 ms ± 2 4.14 s ± 0.01
v0.14.1 20 ms ± 1 48 ms ± 1 399 ms ± 8 4.16 s ± 0.01
v0.14.0 20 ms ± 1 47 ms ± 1 393 ms ± 2 4.16 s ± 0.01
v0.13.0 20 ms ± 1 48 ms ± 1 392 ms ± 3 4.18 s ± 0.01
v0.12.0 21 ms ± 1 47 ms ± 1 393 ms ± 2 4.15 s ± 0.00
v0.11.0 12 ms ± 1 47 ms ± 1 393 ms ± 2 4.15 s ± 0.00
v0.10.2 20 ms ± 1 47 ms ± 1 393 ms ± 2 4.16 s ± 0.00
v0.10.1 20 ms ± 1 66 ms ± 1 393 ms ± 1 4.17 s ± 0.00
v0.10.0 20 ms ± 1 48 ms ± 1 394 ms ± 2 4.17 s ± 0.01

S5 — Fix-pass content edits

Four content-edit rules under --fix (final_newline, no_trailing_whitespace, line_endings, no_bom). Read, transform, atomic-rename. The only --fix-mode bench. Catches fix-pipeline regressions.

S5 — full

Version 1k 10k 100k 1M
v0.15.0 16 ms ± 1 117 ms ± 1 1.20 s ± 0.01 12.77 s ± 0.08
v0.14.2 15 ms ± 1 116 ms ± 1 1.19 s ± 0.00 12.74 s ± 0.03
v0.14.1 16 ms ± 1 121 ms ± 4 1.22 s ± 0.04 12.61 s ± 0.02
v0.14.0 16 ms ± 1 120 ms ± 1 1.24 s ± 0.00 13.18 s ± 0.05
v0.13.0 15 ms ± 1 113 ms ± 1 1.17 s ± 0.00 12.42 s ± 0.03
v0.12.0 15 ms ± 1 114 ms ± 1 1.17 s ± 0.00 12.47 s ± 0.03
v0.11.0 15 ms ± 1 114 ms ± 1 1.17 s ± 0.01 12.48 s ± 0.04
v0.10.2 15 ms ± 1 112 ms ± 1 1.16 s ± 0.00 12.38 s ± 0.03
v0.10.1 15 ms ± 1 112 ms ± 1 1.16 s ± 0.00 12.37 s ± 0.01
v0.10.0 16 ms ± 1 112 ms ± 1 1.17 s ± 0.00 12.45 s ± 0.01

S5 — changed

Version 1k 10k 100k 1M
v0.15.0 13 ms ± 1 49 ms ± 1 430 ms ± 2 4.57 s ± 0.02
v0.14.2 19 ms ± 1 50 ms ± 1 431 ms ± 2 4.59 s ± 0.02
v0.14.1 20 ms ± 2 50 ms ± 2 440 ms ± 6 4.59 s ± 0.00
v0.14.0 19 ms ± 1 50 ms ± 1 437 ms ± 2 4.64 s ± 0.01
v0.13.0 19 ms ± 1 50 ms ± 1 431 ms ± 3 4.61 s ± 0.02
v0.12.0 19 ms ± 1 50 ms ± 1 429 ms ± 1 4.58 s ± 0.01
v0.11.0 11 ms ± 1 49 ms ± 0 430 ms ± 1 4.56 s ± 0.00
v0.10.2 19 ms ± 1 49 ms ± 1 431 ms ± 2 4.60 s ± 0.00
v0.10.1 20 ms ± 1 68 ms ± 1 432 ms ± 2 4.59 s ± 0.01
v0.10.0 19 ms ± 1 50 ms ± 1 433 ms ± 2 4.60 s ± 0.01

S6 — Per-file content fan-out

Thirteen content rules over **/*.rs. Per-file dispatch path width — every .rs file hit by every rule on a single read. Stresses the v0.9.3 dispatch-flip read-coalescing path. Catches per-file inner-loop regressions S3 doesn't surface.

S6 — full

Version 1k 10k 100k 1M
v0.15.0 19 ms ± 1 158 ms ± 1 1.64 s ± 0.01 17.60 s ± 0.21
v0.14.2 19 ms ± 1 158 ms ± 2 1.63 s ± 0.01 17.35 s ± 0.02
v0.14.1 20 ms ± 1 161 ms ± 6 1.68 s ± 0.04 17.27 s ± 0.08
v0.14.0 20 ms ± 1 162 ms ± 1 1.68 s ± 0.01 17.86 s ± 0.01
v0.13.0 19 ms ± 1 149 ms ± 1 1.56 s ± 0.00 16.66 s ± 0.02
v0.12.0 19 ms ± 1 150 ms ± 1 1.57 s ± 0.00 16.71 s ± 0.02
v0.11.0 19 ms ± 1 150 ms ± 1 1.56 s ± 0.01 16.74 s ± 0.10
v0.10.2 18 ms ± 1 149 ms ± 1 1.55 s ± 0.00 16.62 s ± 0.02
v0.10.1 18 ms ± 1 149 ms ± 2 1.56 s ± 0.01 16.62 s ± 0.02
v0.10.0 18 ms ± 1 149 ms ± 1 1.56 s ± 0.01 16.70 s ± 0.02

S6 — changed

Version 1k 10k 100k 1M
v0.15.0 14 ms ± 1 54 ms ± 1 478 ms ± 1 5.06 s ± 0.01
v0.14.2 19 ms ± 1 54 ms ± 1 476 ms ± 2 5.08 s ± 0.01
v0.14.1 20 ms ± 1 56 ms ± 2 486 ms ± 10 5.07 s ± 0.00
v0.14.0 20 ms ± 1 55 ms ± 1 485 ms ± 3 5.12 s ± 0.01
v0.13.0 20 ms ± 1 54 ms ± 1 474 ms ± 2 5.03 s ± 0.00
v0.12.0 19 ms ± 1 54 ms ± 1 473 ms ± 1 5.02 s ± 0.00
v0.11.0 12 ms ± 1 54 ms ± 1 473 ms ± 2 5.02 s ± 0.01
v0.10.2 20 ms ± 1 53 ms ± 2 473 ms ± 2 5.03 s ± 0.01
v0.10.1 19 ms ± 1 72 ms ± 1 474 ms ± 2 5.02 s ± 0.01
v0.10.0 19 ms ± 1 54 ms ± 1 473 ms ± 1 5.04 s ± 0.01

S7 — Cross-file relational

Six cross-file relational kinds (pair, unique_by, for_each_dir, for_each_file, dir_only_contains, every_matching_has). Various fan-out shapes over the synthetic monorepo. Catches the next O(D × N) cliff after the v0.9.5 path-index fix; the v0.9.7 → v0.9.8 transition's headline cell.

S7 — full

Version 1k 10k 100k 1M
v0.15.0 12 ms ± 1 43 ms ± 2 513 ms ± 8 16.06 s ± 0.19
v0.14.2 12 ms ± 1 44 ms ± 2 510 ms ± 9 16.19 s ± 0.23
v0.14.1 12 ms ± 2 45 ms ± 2 521 ms ± 7 16.24 s ± 0.17
v0.14.0 12 ms ± 1 45 ms ± 3 515 ms ± 7 16.24 s ± 0.13
v0.13.0 13 ms ± 1 43 ms ± 1 514 ms ± 8 16.26 s ± 0.17
v0.12.0 13 ms ± 1 44 ms ± 2 517 ms ± 4 16.13 s ± 0.29
v0.11.0 13 ms ± 1 44 ms ± 3 514 ms ± 4 16.29 s ± 0.11
v0.10.2 12 ms ± 1 43 ms ± 2 511 ms ± 4 16.33 s ± 0.03
v0.10.1 12 ms ± 1 43 ms ± 2 516 ms ± 7 16.25 s ± 0.17
v0.10.0 12 ms ± 1 43 ms ± 2 520 ms ± 7 16.35 s ± 0.14

S7 — changed

Version 1k 10k 100k 1M
v0.15.0 18 ms ± 1 65 ms ± 2 697 ms ± 9 18.15 s ± 0.14
v0.14.2 23 ms ± 1 65 ms ± 2 701 ms ± 9 18.13 s ± 0.17
v0.14.1 24 ms ± 2 67 ms ± 3 706 ms ± 11 18.09 s ± 0.11
v0.14.0 24 ms ± 1 65 ms ± 2 696 ms ± 6 18.19 s ± 0.11
v0.13.0 24 ms ± 1 65 ms ± 2 701 ms ± 4 18.15 s ± 0.08
v0.12.0 24 ms ± 1 64 ms ± 2 694 ms ± 5 18.11 s ± 0.13
v0.11.0 16 ms ± 1 65 ms ± 2 693 ms ± 4 18.18 s ± 0.03
v0.10.2 24 ms ± 1 65 ms ± 2 701 ms ± 4 18.11 s ± 0.07
v0.10.1 24 ms ± 1 83 ms ± 2 702 ms ± 8 18.22 s ± 0.05
v0.10.0 24 ms ± 2 64 ms ± 2 695 ms ± 6 18.10 s ± 0.14

S8 — Git overlay

S3 reshape plus git_no_denied_paths and git_tracked_only over a real git repo. Same as S3 but with Engine::collect_git_tracked_if_needed and BlameCache active. Catches git-aware dispatch regressions at scale.

S8 — full

Version 1k 10k 100k 1M
v0.15.0 27 ms ± 1 167 ms ± 2 1.60 s ± 0.01 17.64 s ± 0.39
v0.14.2 27 ms ± 1 166 ms ± 2 1.59 s ± 0.01 17.44 s ± 0.06
v0.14.1 28 ms ± 2 168 ms ± 4 1.62 s ± 0.04 17.29 s ± 0.04
v0.14.0 29 ms ± 1 171 ms ± 2 1.63 s ± 0.01 17.93 s ± 0.04
v0.13.0 27 ms ± 1 160 ms ± 1 1.52 s ± 0.01 16.92 s ± 0.05
v0.12.0 27 ms ± 1 161 ms ± 2 1.53 s ± 0.01 16.85 s ± 0.03
v0.11.0 27 ms ± 1 161 ms ± 2 1.53 s ± 0.01 16.88 s ± 0.03
v0.10.2 27 ms ± 1 159 ms ± 2 1.52 s ± 0.01 16.76 s ± 0.03
v0.10.1 26 ms ± 1 159 ms ± 2 1.51 s ± 0.01 16.54 s ± 0.24
v0.10.0 26 ms ± 1 159 ms ± 2 1.53 s ± 0.01 16.85 s ± 0.03

S8 — changed

Version 1k 10k 100k 1M
v0.15.0 22 ms ± 1 83 ms ± 2 600 ms ± 5 6.47 s ± 0.00
v0.14.2 28 ms ± 1 84 ms ± 2 602 ms ± 7 6.46 s ± 0.01
v0.14.1 29 ms ± 1 85 ms ± 3 613 ms ± 7 6.51 s ± 0.03
v0.14.0 29 ms ± 0 83 ms ± 1 608 ms ± 7 6.52 s ± 0.04
v0.13.0 29 ms ± 1 82 ms ± 1 604 ms ± 3 6.55 s ± 0.02
v0.12.0 29 ms ± 1 83 ms ± 2 605 ms ± 4 6.52 s ± 0.00
v0.11.0 21 ms ± 1 83 ms ± 2 604 ms ± 6 6.52 s ± 0.02
v0.10.2 28 ms ± 1 83 ms ± 1 607 ms ± 5 6.61 s ± 0.03
v0.10.1 28 ms ± 1 101 ms ± 2 606 ms ± 4 6.55 s ± 0.03
v0.10.0 29 ms ± 1 83 ms ± 2 608 ms ± 6 6.58 s ± 0.03

S9 — Nested polyglot

Three competing ecosystem rulesets: extends: rust + node + python (~26 rules) over a polyglot tree (Rust under crates/, Node under packages/, Python under apps/). Per-rule scope_filter: { has_ancestor: <manifest> } ancestor walks. The dispatch shape the v0.9.6 scope_filter: primitive was designed for — without it, every **/*.py rule from python@v1 fires on every .py file in the tree. New in v0.9.6.

S9 — full

Version 1k 10k 100k 1M
v0.15.0 18 ms ± 1 111 ms ± 1 1.10 s ± 0.01 11.97 s ± 0.32
v0.14.2 18 ms ± 1 109 ms ± 1 1.10 s ± 0.01 11.87 s ± 0.09
v0.14.1 18 ms ± 1 114 ms ± 3 1.12 s ± 0.03 11.77 s ± 0.03
v0.14.0 18 ms ± 1 114 ms ± 2 1.14 s ± 0.01 12.20 s ± 0.06
v0.13.0 18 ms ± 1 106 ms ± 2 1.06 s ± 0.01 11.36 s ± 0.01
v0.12.0 17 ms ± 1 107 ms ± 2 1.06 s ± 0.00 11.48 s ± 0.04
v0.11.0 17 ms ± 1 107 ms ± 1 1.07 s ± 0.01 11.49 s ± 0.05
v0.10.2 17 ms ± 1 106 ms ± 2 1.06 s ± 0.00 11.42 s ± 0.05
v0.10.1 17 ms ± 1 105 ms ± 1 1.06 s ± 0.01 11.46 s ± 0.07
v0.10.0 17 ms ± 1 106 ms ± 1 1.06 s ± 0.00 11.42 s ± 0.03

S9 — changed

Version 1k 10k 100k 1M
v0.15.0 22 ms ± 1 53 ms ± 1 442 ms ± 2 4.68 s ± 0.02
v0.14.2 22 ms ± 1 54 ms ± 1 443 ms ± 3 4.69 s ± 0.01
v0.14.1 23 ms ± 1 55 ms ± 1 452 ms ± 8 4.70 s ± 0.02
v0.14.0 14 ms ± 1 54 ms ± 1 446 ms ± 1 4.72 s ± 0.01
v0.13.0 23 ms ± 1 53 ms ± 1 444 ms ± 2 4.72 s ± 0.02
v0.12.0 22 ms ± 1 54 ms ± 1 443 ms ± 3 4.70 s ± 0.01
v0.11.0 22 ms ± 1 54 ms ± 1 442 ms ± 2 4.73 s ± 0.02
v0.10.2 23 ms ± 1 53 ms ± 1 442 ms ± 2 4.70 s ± 0.01
v0.10.1 22 ms ± 1 53 ms ± 1 443 ms ± 2 4.71 s ± 0.00
v0.10.0 22 ms ± 1 53 ms ± 1 445 ms ± 2 4.73 s ± 0.02

S10 — scope_filter outside per-file dispatch

Five rules from outside the PerFileRule dispatch path (file_max_size, no_empty_files, no_symlinks, filename_case, filename_regex) each with scope_filter: { has_ancestor: <manifest> } over the polyglot tree. Per-rule evaluate() iterating ctx.index.files() with both path-glob AND scope_filter narrowing — the dispatch shape v0.9.9 wired through (v0.9.8 silently dropped scope_filter: on these 17 rule kinds). New in v0.9.9.

S10 — full

Version 1k 10k 100k 1M
v0.15.0 10 ms ± 1 51 ms ± 4 459 ms ± 11 5.06 s ± 0.07
v0.14.2 10 ms ± 1 50 ms ± 3 458 ms ± 13 5.04 s ± 0.05
v0.14.1 11 ms ± 1 51 ms ± 2 467 ms ± 12 5.06 s ± 0.02
v0.14.0 10 ms ± 1 51 ms ± 3 457 ms ± 10 5.06 s ± 0.05
v0.13.0 10 ms ± 2 51 ms ± 4 456 ms ± 11 5.06 s ± 0.03
v0.12.0 10 ms ± 1 50 ms ± 4 454 ms ± 9 5.05 s ± 0.10
v0.11.0 10 ms ± 1 51 ms ± 4 458 ms ± 12 5.04 s ± 0.11
v0.10.2 11 ms ± 1 53 ms ± 3 457 ms ± 11 5.12 s ± 0.07
v0.10.1 10 ms ± 1 52 ms ± 3 452 ms ± 8 5.12 s ± 0.22
v0.10.0 11 ms ± 1 51 ms ± 4 460 ms ± 9 5.12 s ± 0.11

S10 — changed

Version 1k 10k 100k 1M
v0.15.0 20 ms ± 1 52 ms ± 1 457 ms ± 5 5.13 s ± 0.03
v0.14.2 19 ms ± 1 50 ms ± 1 428 ms ± 6 4.54 s ± 0.01
v0.14.1 20 ms ± 1 50 ms ± 1 429 ms ± 7 4.53 s ± 0.02
v0.14.0 11 ms ± 1 50 ms ± 1 429 ms ± 5 4.55 s ± 0.01
v0.13.0 19 ms ± 1 50 ms ± 1 430 ms ± 6 4.53 s ± 0.02
v0.12.0 19 ms ± 1 49 ms ± 0 430 ms ± 4 4.57 s ± 0.04
v0.11.0 19 ms ± 1 50 ms ± 1 429 ms ± 3 4.55 s ± 0.02
v0.10.2 20 ms ± 1 50 ms ± 1 430 ms ± 4 4.54 s ± 0.02
v0.10.1 19 ms ± 1 50 ms ± 1 428 ms ± 4 4.56 s ± 0.02
v0.10.0 19 ms ± 1 49 ms ± 1 431 ms ± 5 4.56 s ± 0.01

S11 — v0.10 cross-file dispatch class

Three v0.10 cross-file kinds (registry_paths_resolve, cross_file_value_equals, pair_hash) over the regular synthetic monorepo with a manifest.sha256 overlay. Exercises the whole-repo entry points the v0.10 cross-file engine uses, plus the new crate::extract / crate::io::read_capped helpers. Adds to S7 (the v0.2-era cross-file family: pair / unique_by / for_each_* / dir_only_contains / every_matching_has) by covering the v0.10 additions. New in v0.10.0.

S11 — full

Version 1k 10k 100k 1M
v0.15.0 9 ms ± 1 31 ms ± 1 234 ms ± 2 2.37 s ± 0.00
v0.14.2 9 ms ± 1 31 ms ± 1 235 ms ± 3 2.38 s ± 0.00
v0.14.1 9 ms ± 1 32 ms ± 2 236 ms ± 4 2.39 s ± 0.00
v0.14.0 10 ms ± 1 32 ms ± 1 238 ms ± 4 2.41 s ± 0.01
v0.13.0 9 ms ± 1 30 ms ± 1 230 ms ± 3 2.36 s ± 0.00
v0.12.0 10 ms ± 1 29 ms ± 1 231 ms ± 4 2.36 s ± 0.01
v0.11.0 10 ms ± 1 29 ms ± 1 230 ms ± 3 2.35 s ± 0.01
v0.10.2 9 ms ± 1 30 ms ± 1 231 ms ± 4 2.37 s ± 0.01
v0.10.1 9 ms ± 1 30 ms ± 1 232 ms ± 5 2.36 s ± 0.00
v0.10.0 9 ms ± 1 30 ms ± 2 231 ms ± 4 2.37 s ± 0.00

S11 — changed

Version 1k 10k 100k 1M
v0.15.0 15 ms ± 1 52 ms ± 2 421 ms ± 3 4.37 s ± 0.02
v0.14.2 21 ms ± 1 51 ms ± 1 421 ms ± 4 4.40 s ± 0.02
v0.14.1 21 ms ± 1 53 ms ± 2 424 ms ± 3 4.40 s ± 0.01
v0.14.0 21 ms ± 1 53 ms ± 1 424 ms ± 4 4.41 s ± 0.00
v0.13.0 20 ms ± 1 52 ms ± 1 417 ms ± 4 4.41 s ± 0.01
v0.12.0 21 ms ± 1 51 ms ± 1 418 ms ± 4 4.37 s ± 0.01
v0.11.0 13 ms ± 1 51 ms ± 1 416 ms ± 3 4.37 s ± 0.02
v0.10.2 20 ms ± 1 51 ms ± 1 416 ms ± 2 4.39 s ± 0.01
v0.10.1 20 ms ± 1 70 ms ± 1 418 ms ± 3 4.38 s ± 0.01
v0.10.0 20 ms ± 1 51 ms ± 1 420 ms ± 3 4.38 s ± 0.01

S12 — v0.10 per-file dispatch class

Three v0.10 per-file kinds (ordered_block, import_gate, xml_path_equals + xml_path_matches) over **/*.rs plus a single root-level .csproj overlay (per-package fan-out skipped to keep cross-version file counts stable). Exercises the per-file dispatch path made fast by v0.9.3, with the v0.10-new extraction / regex / XML structured-query paths. Adds to S6 (dense content fan-out on **/*.rs) by covering the v0.10 additions independently of S6's pure-content baseline. New in v0.10.0.

S12 — full

Version 1k 10k 100k 1M
v0.15.0 10 ms ± 1 44 ms ± 1 391 ms ± 2 4.08 s ± 0.01
v0.14.2 11 ms ± 1 42 ms ± 1 379 ms ± 2 3.96 s ± 0.02
v0.14.1 11 ms ± 1 44 ms ± 1 393 ms ± 6 4.06 s ± 0.02
v0.14.0 11 ms ± 1 49 ms ± 1 432 ms ± 2 4.48 s ± 0.01
v0.13.0 11 ms ± 1 44 ms ± 1 385 ms ± 3 4.03 s ± 0.01
v0.12.0 10 ms ± 1 44 ms ± 1 383 ms ± 2 4.02 s ± 0.02
v0.11.0 11 ms ± 1 44 ms ± 1 382 ms ± 3 3.97 s ± 0.03
v0.10.2 11 ms ± 1 45 ms ± 1 397 ms ± 2 4.13 s ± 0.02
v0.10.1 11 ms ± 1 45 ms ± 2 396 ms ± 3 4.15 s ± 0.02
v0.10.0 11 ms ± 1 44 ms ± 1 395 ms ± 1 4.16 s ± 0.02

S12 — changed

Version 1k 10k 100k 1M
v0.15.0 14 ms ± 1 49 ms ± 1 409 ms ± 3 4.37 s ± 0.01
v0.14.2 20 ms ± 1 49 ms ± 1 408 ms ± 2 4.41 s ± 0.01
v0.14.1 20 ms ± 2 49 ms ± 2 417 ms ± 8 4.38 s ± 0.02
v0.14.0 20 ms ± 1 50 ms ± 1 413 ms ± 2 4.42 s ± 0.01
v0.13.0 20 ms ± 1 49 ms ± 1 410 ms ± 2 4.41 s ± 0.01
v0.12.0 20 ms ± 1 48 ms ± 1 411 ms ± 2 4.40 s ± 0.02
v0.11.0 12 ms ± 1 49 ms ± 1 409 ms ± 2 4.39 s ± 0.02
v0.10.2 20 ms ± 1 49 ms ± 1 411 ms ± 3 4.42 s ± 0.01
v0.10.1 20 ms ± 1 67 ms ± 1 413 ms ± 2 4.41 s ± 0.01
v0.10.0 20 ms ± 1 50 ms ± 1 412 ms ± 2 4.42 s ± 0.01

S13 — v0.10 single-shot dispatch class

Two v0.10 single-shot kinds (generated_file_fresh, command_idempotent) declared with command: ["true"] so the row measures crate::spawn::run_capturing (fork / exec / concurrent pipe-drain / wait / stdout-parse), not the user's tool. Single-shot rules add a fixed cost per run; tree walk dominates the row. Signal of interest is cross-version stability of the spawn path — regressions in crate::spawn or the engine's single-shot dispatch surface here in isolation. New in v0.10.0.

S13 — full

Version 1k 10k 100k 1M
v0.15.0 19 ms ± 1 34 ms ± 1 210 ms ± 1 2.18 s ± 0.01
v0.14.2 18 ms ± 1 35 ms ± 1 212 ms ± 1 2.19 s ± 0.00
v0.14.1 18 ms ± 1 35 ms ± 2 222 ms ± 7 2.20 s ± 0.00
v0.14.0 18 ms ± 1 35 ms ± 1 214 ms ± 1 2.20 s ± 0.01
v0.13.0 19 ms ± 1 35 ms ± 1 213 ms ± 1 2.21 s ± 0.00
v0.12.0 18 ms ± 1 35 ms ± 1 213 ms ± 1 2.20 s ± 0.01
v0.11.0 18 ms ± 1 35 ms ± 1 212 ms ± 1 2.19 s ± 0.00
v0.10.2 18 ms ± 1 34 ms ± 1 213 ms ± 1 2.20 s ± 0.00
v0.10.1 18 ms ± 1 35 ms ± 1 213 ms ± 1 2.20 s ± 0.01
v0.10.0 19 ms ± 1 35 ms ± 1 216 ms ± 1 2.21 s ± 0.00

S13 — changed

Version 1k 10k 100k 1M
v0.15.0 23 ms ± 1 56 ms ± 1 397 ms ± 2 4.18 s ± 0.00
v0.14.2 29 ms ± 1 56 ms ± 1 398 ms ± 3 4.22 s ± 0.01
v0.14.1 30 ms ± 1 58 ms ± 2 410 ms ± 8 4.20 s ± 0.00
v0.14.0 29 ms ± 1 57 ms ± 1 401 ms ± 1 4.21 s ± 0.01
v0.13.0 30 ms ± 1 56 ms ± 1 400 ms ± 2 4.22 s ± 0.01
v0.12.0 30 ms ± 1 56 ms ± 1 400 ms ± 1 4.20 s ± 0.01
v0.11.0 22 ms ± 1 57 ms ± 1 399 ms ± 1 4.20 s ± 0.00
v0.10.2 29 ms ± 1 56 ms ± 1 401 ms ± 1 4.21 s ± 0.01
v0.10.1 30 ms ± 1 74 ms ± 1 403 ms ± 3 4.21 s ± 0.01
v0.10.0 30 ms ± 1 56 ms ± 1 401 ms ± 2 4.23 s ± 0.01

S14 — v0.12 featureset

A single deliberately-mixed scenario exercising every file-shape rule kind / mode the v0.12 cycle added, so one row catches a regression anywhere in the v0.12 surface. Where S11-S13 are per-dispatch-class, this is per-feature-set — the v0.12 analogue of running the whole new vocabulary over the macro tree once. New in v0.12.0.

S14 — full

Version 1k 10k 100k 1M
v0.15.0 444 ms ± 1 4.62 s ± 0.02 46.73 s ± 0.21 477.1 s ± 1.8
v0.14.2 445 ms ± 1 4.62 s ± 0.01 46.67 s ± 0.39 474.2 s ± 0.7
v0.14.1 459 ms ± 19 4.65 s ± 0.14 46.70 s ± 0.25 474.7 s ± 0.5
v0.14.0 448 ms ± 2 4.67 s ± 0.02 47.08 s ± 0.19 477.2 s ± 1.4
v0.13.0 456 ms ± 2 4.74 s ± 0.02 48.00 s ± 0.26 488.8 s ± 0.8
v0.12.0 455 ms ± 2 4.72 s ± 0.02 47.87 s ± 0.25 487.3 s ± 2.1
v0.11.0 n/a n/a n/a n/a
v0.10.2 n/a n/a n/a n/a
v0.10.1 n/a n/a n/a n/a
v0.10.0 n/a n/a n/a n/a

S14 — changed

Version 1k 10k 100k 1M
v0.15.0 449 ms ± 1 4.64 s ± 0.02 46.79 s ± 0.12 476.0 s ± 2.2
v0.14.2 455 ms ± 2 4.63 s ± 0.02 46.68 s ± 0.14 474.8 s ± 0.9
v0.14.1 462 ms ± 18 4.66 s ± 0.14 46.78 s ± 0.21 474.5 s ± 1.4
v0.14.0 458 ms ± 2 4.67 s ± 0.03 47.08 s ± 0.18 477.1 s ± 0.5
v0.13.0 465 ms ± 2 4.75 s ± 0.02 48.07 s ± 0.14 487.8 s ± 1.4
v0.12.0 464 ms ± 2 4.75 s ± 0.01 47.81 s ± 0.20 488.3 s ± 0.4
v0.11.0 n/a n/a n/a n/a
v0.10.2 n/a n/a n/a n/a
v0.10.1 n/a n/a n/a n/a
v0.10.0 n/a n/a n/a n/a

How to add a row

When a release tag lands, the bench-record.yml workflow (introduced in v0.9.7) auto-runs the publish-grade matrix on the self-hosted Linux runner and opens a PR with the new per-version dir. The maintainer re-renders this file from the merged data:

python3 xtask/scripts/render-history.py > docs/benchmarks/HISTORY.md

See ../../RELEASING.md for the full review checklist (CV check, fingerprint check, investigation hand-off if delta > 20 %).

Cross-version perf investigations