Benchmarks
The row benchmark behind the numbers on the home page: the app, the machine, the method and every measurement, read from the newest run.
One app, written three times: a table of rows with buttons to create, update, swap, remove and clear them. It is built in ShadowJS, Solid and React for production and run in Chromium. This page holds the whole table, the conditions and how to run it again. Every number below is read from the newest result file when the site is built.
What is measured#
- JavaScript shipped. The gzip size of the app's production JavaScript.
- Row operations. The time from the click to the next painted frame, for eight operations on a table of rows. The median of the samples is shown.
- Heap. The JavaScript heap a page of 1,000 rows adds, after a full garbage collection.
Conditions#
| Condition | Value |
|---|---|
| Date | 2026-10-18 |
| Machine | Apple M5 Pro, 15 logical CPUs, 48 GiB, darwin 27.0.0 |
| Browser | 153.0.8010.12 (Chromium) |
| Frameworks | React 19.3.0, Solid 1.9.17, and ShadowJS built from this repository |
| Samples | 30 per operation and framework |
| Result file | tools/bench/results/bench-20261018-132411.json |
Results#
Median time of the operation, in milliseconds. Operations that finish within about two frames of each other (the frame floor of this run is 32.1 ms) cannot be ranked by it.
| Operation | ShadowJS | Solid | React |
|---|---|---|---|
| Create 1,000 rows (cannot be told apart) | 33.4 ms | 33.4 ms | 33.3 ms |
| Create 10,000 rows (cannot be told apart) | 236.8 ms | 230.7 ms | 343.6 ms |
| Update every 10th row (cannot be told apart) | 31.6 ms | 31.4 ms | 31.1 ms |
| Select a row (cannot be told apart) | 32.2 ms | 31.1 ms | 31.5 ms |
| Swap two rows (cannot be told apart) | 32.0 ms | 31.6 ms | 32.9 ms |
| Remove a row (cannot be told apart) | 31.5 ms | 31.9 ms | 32.6 ms |
| Clear all rows (cannot be told apart) | 31.8 ms | 31.7 ms | 31.6 ms |
| Append 1,000 rows (cannot be told apart) | 32.8 ms | 33.1 ms | 32.5 ms |
| Size and memory | ShadowJS | Solid | React |
|---|---|---|---|
| JavaScript shipped, gzip | 12 KiB | 7.5 KiB | 67.2 KiB |
| JavaScript heap added by 1,000 rows | 2.24 MiB | 2.11 MiB | 2.1 MiB |
Reading the numbers#
- ShadowJS ships 12 KiB of JavaScript for this app, less than React (67.2 KiB) and more than Solid (7.5 KiB).
- Creating 10,000 rows takes ShadowJS 236.8 ms, React 343.6 ms and Solid 230.7 ms.
- On the other 7 operations, 7 finish within the frame floor of each other in this run, so it does not rank them.
- With 1,000 rows ShadowJS adds 2.24 MiB of JavaScript heap, Solid 2.11 MiB and React 2.1 MiB.
A run measures one app on one machine. It supports these statements and nothing wider. Treat differences inside the frame floor as ties.
Run it again#
npm --prefix tools/bench install
npm run bench
The runner writes a new file to tools/bench/results, and the next build of this site reads it.