Skip to content

Commit 5031a84

Browse files
committed
blog: update JS plugins benchmarks
1 parent 6dba935 commit 5031a84

File tree

1 file changed

+49
-21
lines changed

1 file changed

+49
-21
lines changed

src/blog/2025-10-09-oxlint-js-plugins.md

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -217,46 +217,62 @@ The reasons why this alternative API has potential to greatly improve performanc
217217

218218
## Performance
219219

220-
As mentioned above, performance is not yet as good as it can be. Our prototyping work has demonstrated significant
221-
speed-gains from various optimizations, which we'll apply in future releases.
220+
As mentioned above, performance has not been our focus in this initial preview release of Oxlint JS plugins.
221+
Our primary goal has been to fill out enough of the API for JS plugins to be useful in real world projects,
222+
and gather feedback from early adopters.
222223

223-
However, even without all those optimizations, the cost of adding JS plugins into the mix is already surprisingly low.
224+
Performance at present is decent, but not by any means stellar.
225+
226+
However - and we feel this is the important point - our prototype of the _next_ version demonstrates that the
227+
architectural design we've settled on is capable of _exceptional_ performance, once various optimizations are added
228+
into the mix (see [Under the hood](#under-the-hood)).
229+
230+
We'll be applying those optimization over the course of the next few months, and users will see multiple x speed-ups
231+
compared to the current version.
232+
233+
That said, even without those optimizations, Oxlint's performance is still competitive.
224234

225235
Oxlint vs ESLint linting a medium-sized TypeScript project [vuejs/core](https://github.com/vuejs/core):
226236

227237
| Linter | Time |
228238
| ---------------------------- | -------- |
229-
| ESLint | 7,030 ms |
230-
| ESLint multi-threaded | 4,541 ms |
231-
| Oxlint | 582 ms |
232-
| Oxlint with custom JS plugin | 584 ms |
239+
| ESLint | 4,116 ms |
240+
| ESLint multi-threaded | 3,710 ms |
241+
| Oxlint | 48 ms |
242+
| Oxlint with custom JS plugin | 236 ms |
233243

234244
<div>
235245
<details>
236246
<summary>Details</summary>
237247

238-
- Benchmark repo: https://github.com/camc314/core/tree/c/bench-custom-plugins
239-
- Benchmarked on 2023 MacBook Pro M2 Max
248+
:::info
249+
250+
- Benchmark repo: https://github.com/overlookmotel/vue-core-cam/tree/bench-js-plugins
251+
- Benchmarked on MacBook Air M3, 24GB RAM
240252
- Bench command:
241253

242254
```sh
243-
hyperfine \
244-
--warmup 1 \
245-
--runs 5 \
246-
'pnpm run oxlint' \
247-
'pnpm run oxlint-with-custom-plugin' \
248-
'pnpm run eslint-with-custom-plugin' \
249-
'pnpm run eslint-with-custom-plugin-parallel' -i
255+
hyperfine -i --warmup 3 \
256+
'./node_modules/.bin/oxlint --silent' \
257+
'./node_modules/.bin/oxlint -c .oxlintrc-with-custom-plugin.json --silent' \
258+
'USE_CUSTOM_PLUGIN=true ./node_modules/.bin/eslint .' \
259+
'USE_CUSTOM_PLUGIN=true ./node_modules/.bin/eslint . --concurrency=auto'
250260
```
251261

262+
Note: The version of Oxlint on NPM at time of writing (1.23.0) has a bug which affects this benchmark, and hugely
263+
underestimates the cost of JS plugins. The above results were obtained using latest `main` branch, after the bug fix,
264+
at [this commit](https://github.com/oxc-project/oxc/commit/cd266b4c101c35c33e122457cdd0b514b44597a9).
265+
Please also see [below](#edit-18th-oct-2025).
266+
267+
:::
268+
252269
</details>
253270
</div>
254271

255-
In this example, the cost of adding a simple JS plugin to Oxlint is less than 1%, and Oxlint is 8x faster than ESLint,
256-
even using ESLint's new multi-threaded runner.
272+
In this example, adding a simple JS plugin to Oxlint does have a significant cost, but Oxlint is still 15x faster
273+
than ESLint, even using ESLint's new multi-threaded runner.
257274

258-
Obviously, more complicated JS plugins, or many of them, will have a higher performance cost - which is why we will
259-
be focused in future releases on driving down that cost further.
275+
Obviously, more complicated JS plugins, or many of them, will have a higher performance cost.
260276

261277
## Features
262278

@@ -293,7 +309,7 @@ plugin without modification.
293309

294310
#### 2. Improving performance
295311

296-
Performance is already good, but we have proven during our prototyping many significant performance gains from further
312+
Performance is already decent, but we have proven during our prototyping many significant performance gains from further
297313
optimizations. We will apply them, and make JS plugins in Oxlint run at as close to Rust speed as we can get.
298314

299315
## Under the hood
@@ -380,3 +396,15 @@ please let us know. We'll be filling in the gaps in the API over the next few mo
380396
which there's greatest demand.
381397

382398
Happy linting!
399+
400+
---
401+
402+
#### Edit: 18th Oct 2025
403+
404+
The original version of this blog post published on 9th Oct contained benchmarks results which showed the performance
405+
of Oxlint JS plugins to be far better than they are in reality. This was the result of a bug in Oxlint which was causing
406+
JS plugins to be skipped on many files in certain circumstances when the config contains overrides. This bug lead to
407+
the performance of JS plugins being way overestimated in the benchmarks we quoted.
408+
409+
We sincerely apologise for this mistake, and thank [Herrington Darkholme](https://github.com/HerringtonDarkholme)
410+
for pointing out the error.

0 commit comments

Comments
 (0)