alint benchmarks

Sub-second on 100K-file repos. ~1.1 s on a 100K-file synthetic workspace bundle, ~12 s at 1M files. 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 · AMD Ryzen 9 3900X (12-core) · 62 GB · ext4 · rustc 1.95. Absolute numbers are not directly comparable across machines. See methodology for what does and doesn't transfer.

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

Full nixpkgs case study →

Synthetic: per-release trajectory

1M-file headline cells across the most-stressed scenarios. S3 is the realistic-monorepo anchor; S6 is the per-file content fan-out; S7 is the cross-file relational cliff that v0.9.8 closed; 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
v0.9.20 2026-05-10 12.38 s12.20 s15.30 s7.88 s
v0.9.19 2026-05-09 12.15 s11.79 s15.38 s7.60 s
v0.9.18 2026-05-08 11.70 s11.19 s15.56 s7.47 s
v0.9.17 2026-05-06 11.67 s11.38 s15.37 s7.37 s
v0.9.16 2026-05-06 11.58 s10.72 s15.35 s7.21 s
v0.9.14 2026-05-05 12.06 s11.19 s15.31 s7.33 s
v0.9.13 2026-05-04 11.46 s11.18 s15.45 s7.22 s
v0.9.12 2026-05-03 11.98 s11.33 s15.36 s7.46 s
v0.9.11 2026-05-03 11.84 s11.91 s17.29 s8.50 s
v0.9.10 2026-05-03 11.62 s11.22 s15.50 s7.21 s
v0.9.9 2026-05-03 13.23 s11.94 s17.32 s7.91 s
v0.9.8 2026-05-02 11.33 s10.89 s15.41 s7.32 s
v0.9.7 2026-05-02 11.89 s11.35 s614.4 s7.36 s
v0.9.6 2026-05-02 11.09 s11.40 s623.7 s7.12 s
v0.9.5 2026-05-01 12.59 s11.85 s652.4 sn/a
v0.9.4 2026-04-30 731.9 sn/an/an/a
v0.5.7 2026-04-26 n/an/an/an/a
v0.5.6 2026-04-26 569.1 sn/an/an/a

Two cliffs to notice. v0.9.4 → v0.9.5 on S3 1M (731.9 s → 12.59 s) is the lazy path-index + literal-path fast paths fix. v0.9.7 → v0.9.8 on S7 1M (614.4 s → 15.41 s) is the cross-file dispatch fast paths, round 2. Both shipped with investigation write-ups documenting the diagnostic data, the bisect, and the fix. See investigations/.

Full per-release table (S1–S10, 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 (~34 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.