Benchmarks
A cross-runtime comparison run on real hardware. Every benchmark is shown, including the ones EkkoJS does not win. Higher is better.
Overall standing
Scoring. In every one of the 35 benchmarks the four runtimes are ranked 1st to 4th by ops/s. A runtime’s overall score is the average of all those placements, not just its wins, so 1.00 would mean it finished first everywhere and 4.00 means last everywhere. Lower is better.
Because every placement counts equally, steady 2nd and 3rd finishes matter as much as wins, and a single benchmark where one runtime is 20× faster cannot skew the result. The wins figure beside each score counts outright 1st-place finishes only, shown for context.
A note on these numbers
These benchmarks run internally to help us track and improve EkkoJS performance. EkkoJS is a Technology Preview: we do not pretend to compete yet with Node.js, Bun, or Deno, which are production grade, stable, and have been battle-tested for years. The comparison is a compass for our own progress, not a claim of superiority.
Concurrency & Threads
| Benchmark | EkkoJS | Node.js | Bun | Deno |
|---|---|---|---|---|
| spawn-overheadthread start | 265/s | 23/s | 103/s | 30/s |
| parallel-10x5010 workers x 50 | 912/s | n/a | n/a | n/a |
| parallel-speedup4-way scaling x100 | 314/s | 276/s | 287/s | 163/s |
| parallel-speedup-8x8-way scaling x100 | 638/s | 532/s | 506/s | 202/s |
| fib35-parallel-4x | 26/s | 23/s | 36/s | 14/s |
| fib35-parallel-8x | 53/s | 44/s | 64/s | 18/s |
| fib35-sequential-4x | 8/s | 8/s | 13/s | 9/s |
CPU & Math
| Benchmark | EkkoJS | Node.js | Bun | Deno |
|---|---|---|---|---|
| array-create-1k | 962,660/s | 633,411/s | 610,778/s | 679,830/s |
| object-create-simple | 11,584,900/s | 15,397,765/s | 22,479,209/s | 8,307,191/s |
| object-create-nested | 11,254,000/s | 14,925,688/s | 21,796,932/s | 7,854,535/s |
| primes-10k | 25,513/s | 11,604/s | 24,636/s | 26,454/s |
| primes-100k | 1,169/s | 989/s | 2,393/s | 1,181/s |
| math-random-1k | 121,965/s | 115,060/s | 314,895/s | 98,846/s |
| math-sqrt-loop | 38,131/s | 39,612/s | 310,859/s | 38,265/s |
| math-trig | 35,924/s | 28,738/s | 2,637,483/s | 36,333/s |
| sort-1k | 3,638/s | 4,045/s | 4,678/s | 4,038/s |
| sort-10k | 281/s | 280/s | 351/s | 299/s |
| fib-30 | 92/s | 96/s | 143/s | 98/s |
| fib-35 | 8/s | 9/s | 13/s | 9/s |
Strings & Regex
| Benchmark | EkkoJS | Node.js | Bun | Deno |
|---|---|---|---|---|
| string-concat-1k | 177,652/s | 160,307/s | 189,465/s | 191,661/s |
| string-repeat | 4,308,048/s | 4,606,959/s | 503,603/s | 3,935,450/s |
| string-template | 58,101/s | 51,791/s | 74,046/s | 55,821/s |
| regex-match-email | 5,610,098/s | 5,760,599/s | 20,654,308/s | 4,735,072/s |
| regex-replace | 1,240,005/s | 1,119,138/s | 1,450,250/s | 1,096,735/s |
| regex-test | 7,145,527/s | 7,791,865/s | 22,127,806/s | 5,838,074/s |
JSON
| Benchmark | EkkoJS | Node.js | Bun | Deno |
|---|---|---|---|---|
| json-parse | 229,912/s | 197,112/s | 313,070/s | 219,075/s |
| json-stringify | 405,913/s | 247,623/s | 802,081/s | 642,883/s |
| json-roundtrip | 143,425/s | 105,738/s | 210,110/s | 161,093/s |
Crypto
| Benchmark | EkkoJS | Node.js | Bun | Deno |
|---|---|---|---|---|
| sha256-hash | 375,761/s | 368,877/s | 1,359,972/s | 25,875/s |
| sha256-hash-short | 380,659/s | 375,938/s | 1,473,403/s | 29,608/s |
| random-uuid | 565,297/s | 4,694,497/s | 7,793,021/s | 3,702,664/s |
File I/O
| Benchmark | EkkoJS | Node.js | Bun | Deno |
|---|---|---|---|---|
| file-read-binary-1mb | 5,084/s | 4,904/s | 4,045/s | 2,412/s |
| file-read-text-1mb | 722/s | 622/s | 3,979/s | 1,532/s |
| file-write-binary-1mb | 394/s | 412/s | 4,159/s | 388/s |
| file-write-text-1mb | 386/s | 390/s | 3,421/s | 360/s |
Numbers vary with hardware and runtime versions. EkkoJS leads the concurrency and thread benchmarks and is competitive on CPU and I/O; Bun leads raw single-thread throughput. Reproduce withbash benchmarks/run.sh in the repository.