- Home
- Benchmarks
Measured, not promised
Every other tool site says "fast". This page publishes the numbers, the input that produced them, the machine they ran on, and the script that regenerates them. If a number here is wrong, it is wrong in a file you can read.
Measured 2026-10-23 · Apple M4 Max · Node 26.0.0 · darwin arm64
| Tool | Operation | Input | Median | Best | Runs | Relative |
|---|---|---|---|---|---|---|
| cURL Converter | Parse a command into a request model | One command, 2 headers, JSON body | 3 µs | 2 µs | 200 | |
| Cron Builder | Parse and validate an expression | 5-field expression | 4 µs | 3 µs | 200 | |
| Hash Generator | SHA-256 over the input | 1.0 MB of text | 0.50 ms | 0.47 ms | 9 | |
| SQL Formatter | Format a 120-column query with five joins | 120 select expressions | 0.53 ms | 0.47 ms | 9 | |
| JSON Schema Generator | Infer a schema from a sample | 2,000 records | 0.95 ms | 0.90 ms | 9 | |
| JSON Diff | Compare two documents by structure | 2,000 records each, 5% changed | 1.02 ms | 0.84 ms | 9 | |
| QR Code Generator | Build the module matrix | 78-character URL, level M | 1.45 ms | 1.02 ms | 9 | |
| JSON Formatter | Minify | 1.0 MB of JSON | 2.94 ms | 2.80 ms | 9 | |
| JSON Formatter | Pretty-print with a two-space indent | 1.0 MB of JSON | 4.01 ms | 3.83 ms | 9 | |
| CSV to JSON | Parse with delimiter detection and type inference | 10,000 rows × 7 columns | 4.67 ms | 2.84 ms | 9 | |
| Markdown Preview | Render GitHub-flavoured Markdown to HTML | 400 sections, ~40 KB | 6.10 ms | 5.88 ms | 9 | |
| JSON to CSV | Flatten and serialise | 10,000 rows × 7 columns | 8.12 ms | 6.70 ms | 9 | |
| Case Converter | Convert to camelCase | 1.0 MB of text | 18 ms | 16 ms | 9 | |
| Text Diff | Line diff with word-level highlighting | 2,000 lines, 2.5% changed | 41 ms | 38 ms | 9 | |
| JSON Repair | Repair trailing commas, single quotes and bare keys | 1.0 MB of broken JSON | 102 ms | 88 ms | 9 |
Bars use a logarithmic scale so the operations under a millisecond stay visible next to the one at 102 ms. Read them as "this is roughly how much slower", not as an absolute value.
What exactly is being measured
Each row times the pure function that does the work: the parser, the formatter, the diff algorithm, the hash. It does not time the browser, the DOM update, the paint or the time it takes you to move the mouse. That is deliberate. The algorithm is the part that would be slow if the implementation were bad, and it is the only part that can be compared across machines without also comparing screens, extensions and power settings.
The measurement is the median of nine runs after one warm-up run. The warm-up matters: without it, the first call absorbs the cost of compiling the function and allocating its data structures, and a nine-run median would mostly report that. The best run is published next to the median because the gap between the two is the honest measure of how noisy the machine was.
Why the inputs are generated, not chosen
Every input is produced by a function in the benchmark script, at a fixed size, with the same content on every run. A hand-picked input is a benchmark that can be tuned until it flatters the code; a generated one cannot. The sizes are chosen to be realistic rather than impressive: one megabyte of JSON is a large payload you might actually paste, ten thousand CSV rows is a real export, two thousand diff lines is a real file.
What the numbers do not tell you
- Your machine is not this machine. A phone will be several times slower and a browser's JavaScript engine differs from Node's. The relative order between two operations is more stable than the absolute numbers.
- It does not measure the network. There is no network step to measure: the tools do not call a server. That absence is the point, and it is why the column of round trips is zero.
- It is one run of the script, not a distribution. There is no confidence interval and no p-value. A benchmark page that pretends to statistics is usually a benchmark page hiding something.
How to reproduce it
The script is in the repository as scripts/bench.ts, and it writes the
same src/data/benchmarks.json that this page reads. Run it with npm run bench. It prints a table and rewrites the file, so a change to an
algorithm that makes it slower shows up in the diff of the next commit.
That last property is the reason the page exists. A performance claim in a README rots the moment somebody edits the parser. A number that is generated by a script and committed alongside the code cannot rot quietly.
Why this matters for a tool that runs locally
When a tool runs on a server, the user cannot tell a slow algorithm from a slow connection, and nobody has an incentive to find out. When it runs in the browser, the latency is yours: every millisecond of a bad algorithm is a millisecond the person waits with the tab frozen. Publishing the number is a way of saying that the difference between 3 µs and 102 ms is a decision somebody made, not an accident.
The tools that sit at the slow end are the ones that do the most work per byte. The text diff walks two thousand lines and then diffs the words inside every changed line; JSON Repair runs a dozen recovery passes because a document can be broken in a dozen different ways. Both are still under a tenth of a second, which is the threshold where an interface stops feeling instant.
Every tool on this list runs in your browser
There is no upload step, no queue and no server, which is why the numbers above have no network term. Open the toolbox and check for yourself, or read how this site makes money.