Benchmarks Code quality

ESLint vs Biome

Four equivalent rule classes over nearly 100,000 lines of JavaScript.

Products compared

Tests

Test 1 Time per pass

20 measured passes over the corpus. Box is the middle half of the runs, line is the median, whiskers reach the fastest and slowest pass, dots are every run. (LOWER ms = FASTER)

Time per pass (ms)
ESLint
Biome
All 20 samples as a table
RunESLintBiome
1108.8 ms75.1 ms
2105.9 ms74.0 ms
3107.2 ms73.6 ms
4107.5 ms72.1 ms
5105.2 ms75.3 ms
6105.5 ms78.7 ms
7105.2 ms79.6 ms
8104.6 ms78.5 ms
9104.2 ms79.4 ms
10108.9 ms76.3 ms
11108.7 ms77.8 ms
12103.5 ms76.2 ms
13104.9 ms74.6 ms
14106.4 ms75.4 ms
15106.9 ms72.8 ms
16105.4 ms75.6 ms
17105.9 ms74.8 ms
18105.6 ms72.5 ms
19105.6 ms75.1 ms
20104.8 ms71.5 ms
Full report, as hyperfine prints it

Benchmark 1: ESLint 9.34.0

Time (mean ± σ)
106.0 ms ± 1.5 ms
Range (min … max)
103.5 ms108.9 ms
Median
105.6 ms 20 runs

Benchmark 2: Biome 2.2.2fastest

Time (mean ± σ)
75.4 ms ± 2.4 ms
Range (min … max)
71.5 ms79.6 ms
Median
75.2 ms 20 runs
Raw catalog JSON
Matched rule intent

Each row is one intent both tools enforce. The implementations differ; the intent is what was held equal.

Rule pairs by intent
IntentESLintBiome
Unused variablesno-unused-varscorrectness/noUnusedVariables
Strict equalityeqeqeqsuspicious/noDoubleEquals
Debugger statementsno-debuggersuspicious/noDebugger
Prefer constprefer-conststyle/useConst
Test conditions: rig, corpus, protocol
Rig
Machine
MacBook Pro
Chip
Apple M2 Max
Cores
12 CPU cores
Memory
96 GB
OS
macOS 26.5.2 (arm64)
Runtime
Bun 1.4.0
Corpus
Name
ESLint 9.34.0 library source
Source
node_modules/eslint/lib/**/*.js
Files
391
Lines
99,880
Size
2.73 MB
Protocol
Warmups
3 unmeasured passes
Measured
20 passes per tool
Process
A new CLI process for every measured pass
Cache
Warm filesystem cache after three unmeasured passes
Output
Diagnostics produced and redirected away from the terminal

What did we learn?

Biome finished 1.4x faster. Biome took 75.2 ms at the median. ESLint took 105.6 ms on the same warmed corpus.

What this does not prove

  • This isolates lint throughput. It does not score rule coverage, editor integrations, migration cost, or ecosystem compatibility.
  • The paired rules express the same intent, but their implementations and exact diagnostics are not identical.
  • The corpus is ESLint's own JavaScript source and may not represent a typical application repository.

Rerun it yourself: the runner and this corpus definition are in the repository, and the methodology page covers what every run holds constant. Think a result is wrong? Open an issue with your rig and your samples.