Markdown linter benchmark¶
In the February 2026 Rust Book cold-start benchmark, rumdl checked 478 Markdown files in 217 ms. The same run measured markdownlint-cli2 at 2.2 s and markdownlint-cli at 2.7 s. These results support a specific claim: rumdl was about 10.2–12.5 times faster than the tested markdownlint CLIs in this workload. They do not establish that rumdl is faster than every Markdown tool.
Last benchmark run: February 2026. The page and methodology were last reviewed in August 2026.
Results¶
| Tool | Type | Mean | Relative to rumdl |
|---|---|---|---|
| mado | Lint | 77 ms | 0.4x |
| rumdl | Lint | 217 ms | 1.0x |
| pymarkdown | Lint | 240 ms | 1.1x |
| remark-lint | Lint | 671 ms | 3.1x |
| markdownlint-cli2 | Lint | 2.2 s | 10.2x |
| markdownlint-cli | Lint | 2.7 s | 12.5x |
| mdformat | Format | 4.0 s | 18.5x |
| Prettier | Format | 4.8 s | 22.3x |
What the benchmark measures¶
The benchmark measures process startup plus one complete check of the Rust Book repository:
- Corpus: The Rust Book snapshot used for the run; its file count appears in the generated summary above
- Application cache: disabled for rumdl with
--no-cache - Operating-system disk cache: warm after the configured warm-up runs
- Runner: hyperfine, with
syncbefore each timed command - Failures: ignored by the runner because lint violations produce a normal non-zero exit code
This is a cold-start workflow benchmark, not a parser microbenchmark. It includes runtime and launcher overhead because developers and CI systems experience that overhead when invoking the tools.
Commands¶
The benchmark script executes these command shapes against the same target:
| Tool | Command |
|---|---|
| rumdl | rumdl check --no-cache TARGET |
| markdownlint-cli | npx markdownlint-cli TARGET |
| markdownlint-cli2 | npx markdownlint-cli2 '**/*.md' from TARGET |
| remark-lint | npx remark --use remark-preset-lint-recommended --quiet TARGET |
| pymarkdown | uvx pymarkdownlnt scan TARGET |
| mado | mado check TARGET |
| mdformat | uvx mdformat --check TARGET |
| Prettier | npx prettier --check 'TARGET/**/*.md' |
The executable source of truth is
scripts/benchmark_cold_start.py.
Reproduce the benchmark¶
Install Rust, Python, Node.js, uv, and
hyperfine, then place a checkout of the
Rust Book next to the rumdl repository:
cargo build --release
python3 scripts/benchmark_cold_start.py --target ../rust-book
uv run --with matplotlib python3 scripts/generate_benchmark_chart.py
The first command builds the rumdl binary being tested. The benchmark script writes hyperfine results locally, and the chart script updates this page's generated result table and the public SVG chart.
How to interpret the result¶
The most useful comparison is with markdownlint-cli and markdownlint-cli2: rumdl implements all 53 markdownlint rules and can discover common markdownlint configuration files, so the tools address a closely related job. Even then, behavior is not identical; review the documented intentional differences before migrating.
mado was faster in this run, but it implemented fewer rules and did not generate fixes or provide rumdl's flavor-aware behavior. Formatters such as mdformat and Prettier also perform a different amount and type of work. The table is therefore evidence about observed command latency, not a universal product ranking.
Limitations¶
- Tool capabilities and workloads are not identical.
- One repository cannot represent every Markdown corpus.
- Results depend on hardware, operating system, tool versions, and repository contents.
- This published result predates benchmark metadata capture, so its exact tool versions and target revision were not retained. Treat it as directional until the next metadata-bearing run.
npxanduvxlauncher behavior can change independently of the tools.
The benchmark runner now records non-personal environment, target revision, and tool-version metadata with future local results.