alint benchmarks

Fast at scale, honestly measured. ~1.7 s on a 100K-file synthetic workspace bundle, ~17.5 s at 1M files; sub-second on lighter scans (filename hygiene 0.23 s, cross-file relational 0.53 s at 100K). Real-world: a 79-rule pass over NixOS/nixpkgs (39,101 files) completes in 273 ms wall-clock, faster than git status on the same repo on a cold cache.

Hardware fingerprint: linux-x86_64 · Intel Core i7-6700HQ (4-core) · 15 GB · ext4 · rustc 1.97 · host kbench, a dedicated quiet box (canonical since 2026-07-15). Absolute numbers are not directly comparable across machines. See methodology for what does and doesn't transfer, and /benchmarks-1 for the retired 3900X series (v0.5.6–v0.13.0, with the v0.9 engine cliffs).

Deterministic performance gating: cargo bench on a seeded tree, gungraun det_engine and det_check under Valgrind for load-immune instruction counts, and an advisory perf-gate job that flags regressions per commit.

What we publish, and how often

Real-world: NixOS/nixpkgs

The largest non-trivial OSS monorepo on GitHub, used as a real-world stress beyond the synthetic 100K bench. The 79-rule pass includes a for_each_dir over the 20,678-directory pkgs/by-name/*/*/ tree, exactly the cross-file dispatch shape the v0.9.5 + v0.9.6 + v0.9.8 engine work was designed to make linear.

MetricNixOS/nixpkgs
Files in tree 39,101 (sparse-cloned)
pkgs/by-name/*/*/ directories iterated 20,678
alint config rule count 79
Wall-clock for full check pass 273 ms

A real-world complement to the synthetic matrix, measured on the 3900X reference desktop (the case study predates the kbench re-baseline), not a like-for-like kbench cell.

Full nixpkgs case study →

Synthetic: per-release trajectory

1M-file headline cells across the most-stressed scenarios, on the current kbench series. S3 is the realistic-monorepo anchor; S6 is the per-file content fan-out; S7 is the cross-file relational path; S9 is the nested-polyglot scenario the scope_filter: primitive exists for. The trajectory is flat by design; the dramatic v0.9 engine cliffs are on the retired 3900X series.

Version Date 1M S3 full 1M S6 full 1M S7 full 1M S9 full
v0.13.0 2026-06-17 17.46 s16.65 s16.09 s11.39 s
v0.12.0 2026-06-07 17.59 s16.74 s16.09 s11.43 s
v0.11.0 2026-05-28 17.52 s16.66 s16.26 s11.44 s
v0.10.2 2026-05-21 17.34 s16.59 s16.02 s11.37 s
v0.10.1 2026-05-20 17.43 s16.59 s16.05 s11.41 s
v0.10.0 2026-05-20 17.65 s16.70 s16.19 s11.46 s

This kbench series is deliberately flat: from v0.10 through the latest release, performance holds steady while the rule surface grew. The dramatic engine cliffs (S3 731.9 s → 12.59 s at v0.9.5; S7 614.4 s → 15.41 s at v0.9.8), each with an investigation write-up, are on the retired 3900X series. See investigations/ for the diagnostic write-ups.

Full per-release table (S1–S13, all sizes, both modes) →

What each scenario stresses

Scenario Shape Catches regressions in…
S1 Filename hygiene 8 filename-only rules Walker + scope-match
S2 Existence + content 8 existence + content rules Per-file content fan-out
S3 Workspace bundle extends: oss-baseline + rust + monorepo + cargo-workspace (32 rules) Realistic monorepo workload
S4 Agent-era hygiene 5 rules from agent-hygiene@v1 Agent-era rule shapes
S5 Fix-pass content edits 4 content-edit rules under --fix Fix-pipeline regressions
S6 Per-file content fan-out 13 content rules over **/*.rs Per-file inner-loop
S7 Cross-file relational 6 cross-file kinds (pair, unique_by, for_each_dir, …) Cross-file dispatch cliff
S8 Git overlay S3 reshape + git_no_denied_paths + git_tracked_only Git-aware dispatch
S9 Nested polyglot extends: rust + node + python (26 rules) over polyglot tree with scope_filter: Polyglot scope-filter dispatch

Methodology, short version

Two layers. criterion for pure-CPU micro-benchmarks (stable, cross-platform, run on every PR). hyperfine driven by xtask bench-scale for end-to-end CLI wall-time (cross-platform, reproducible, honest about variance, run before each release tag).

Three deliberate methodology choices:

Full methodology document →

Honest comparisons

Mostly we don't have apples-to-apples public benches, because the other tools haven't published any.

See /compare/ for the full feature-matrix comparison.

Every published number is reproducible end-to-end on your own hardware.