Перейти до вмісту

Цю сторінку ще не перекладено, тому її показано англійською.

Benchmarks

Published Elide benchmarks: hello-world startup for JavaScript and Python, and HTTP serving throughput and latency, against Node, Bun, Deno and CPython, with machine, date, command and recording.

На цій сторінці

Benchmarks published for Elide 1.6.0. Each number links to a terminal recording or downloadable raw measurement reports. JavaScript startup and HTTP serving were re-recorded on October 15 with the release build 1.6.0, without the optional Python component. Python results retain their October 2 recording. No JVM benchmark is published.

Published Elide benchmarks Three bar charts. JavaScript hello-world startup, mean milliseconds, lower is better: Elide 1.43, Bun 1.63, Deno 6.31, Node 11.70. Python hello-world startup: Elide 4.8, CPython 6.0. HTTP serving requests per second, higher is better: Elide 635,510, Deno 163,511, Bun 156,974, Node 123,519. JAVASCRIPT STARTUP · MS · LOWER IS BETTER Elide 1.43 ms Bun 1.63 ms Deno 6.31 ms Node 11.70 ms PYTHON STARTUP · MS · LOWER IS BETTER Elide 4.8 ms CPython 6.0 ms HTTP SERVING · REQUESTS/S · HIGHER IS BETTER Elide 635,510 Deno 163,511 Bun 156,974 Node 123,519
  1. JavaScript hello-world startup, mean: Elide 1.43 ms, Bun 1.63 ms, Deno 6.31 ms, Node 11.70 ms.
  2. Python hello-world startup, mean: Elide 4.8 ms, CPython 6.0 ms.
  3. HTTP serving, requests per second: Elide 635,510, Deno 163,511, Bun 156,974, Node 123,519.

JavaScript startup

Time to run a one-line hello.js (console.log("Hello, World!");) and exit. Lower is better.

RuntimeVersionCommandMean
Elide1.6.0elide run hello.js1.43 ± 0.06 ms
Bun1.4.2bun hello.js1.63 ± 0.18 ms
Deno2.9.7deno run hello.js6.31 ± 0.30 ms
Node24.21.0node hello.js11.70 ± 0.90 ms
Hello-world JavaScript startup
  • Elide 1.6.01.43 ms
  • Bun 1.4.21.63 ms
  • Deno 2.9.76.31 ms
  • Node.js 24.21.011.7 ms
1×
Lower is better. Each ball is one run, from start to exit. Slowed 250×: 1 ms measured takes 0.25 s here.
DetailValue
Toolhyperfine -N -w 10 -r 100: no shell, 10 warmup runs, 100 measured
Machine24-core AMD Ryzen Threadripper PRO 9965WX Linux workstation
Date2026-10-15
Recordingbench-startup (below)
0:05 / 0:05

Python startup

Time to run a one-line hello.py (print("Hello, World!")) and exit. Lower is better.

RuntimeVersionCommandMean
Elide1.6.0elide run hello.py4.8 ± 0.3 ms
CPythonnot recordedpython3 hello.py6.0 ± 0.3 ms
Hello-world Python startup
  • Elide 1.6.04.8 ms
  • CPython6 ms
1×
Lower is better. Each ball is one run, from start to exit. Slowed 500×: 1 ms measured takes 0.5 s here.
DetailValue
Toolhyperfine -N -w 10: no shell, 10 warmup runs
Machine24-core Linux workstation
Date2026-10-02
Recordingbench-startup-python (not published as a clip)

Python needs the optional component (elide setup python); see Python with Elide.

HTTP serving

Requests per second and latency for a fetch handler that returns Hello, World!. Higher requests per second and lower latency are better.

// server.mjs
export default {
  port: 3000,
  hostname: "127.0.0.1",
  fetch() {
    return new Response("Hello, World!");
  },
};
RuntimeVersionCommandRequests/sp50 latencyp99 latency
Elide1.6.0elide server.mjs635,5100.38 ms0.59 ms
Deno2.9.7deno serve --port 3000 --host 127.0.0.1 server.mjs163,5111.54 ms1.58 ms
Bun1.4.2bun server.mjs156,9741.60 ms1.80 ms
Node24.22.0 LTSnode node-default.mjs123,5192.03 ms2.24 ms
Default single-context HTTP serving throughput
  • Elide 1.6.0635,510 req/s
  • Deno 2.9.7163,511 req/s
  • Bun 1.4.2156,974 req/s
  • Node.js 24.22.0123,519 req/s
1×
Higher is better. Each dot is 100 responses. Slowed 1000×: 1 ms measured takes 1 s here. Dots cross at the same speed in every lane; only how often they leave differs.
DetailValue
Toolwrk -t12 -c256 -d10s --latency, after a discarded 5-second warmup run
Machine24-core AMD Ryzen Threadripper PRO 9965WX Linux workstation; server on 24 logical CPUs, wrk on 24 others
Date2026-10-15
Recordingbench-serve (below)

The server CPU mask was 0-11,24-35; the client mask was 12-23,36-47: twelve physical cores and their SMT siblings per side, in a private network namespace. The table shows one recorded run on this machine.

Each server used its defaults and one JavaScript application context. Elide also uses transport threads. This is an apples-to-apples comparison of default settings with the same handler and load, not a comparison of maximum multi-core capacity. Node uses an equivalent native http handler with the same 13-byte body; HTTP headers remain runtime-specific. Its separate run used the same machine, CPU masks, private network namespace, warmup, and load settings, with no reported socket or HTTP status errors. Node’s raw report and handler are included in the reproduction package. The recording below covers the original three runtimes.

0:15 / 0:15

Multi-context peak serving

The same Elide binary reached 10,697,938 requests/s with 24 application contexts in one process and HTTP/1.1 pipeline depth 16. Three fresh-server runs measured 10,697,938, 10,376,454, 10,648,229 requests/s; the mean was 10,574,207 requests/s. Every warmup and measured run reported zero request errors. Ordered-response preflight checked status, framing, and body bytes before each load.

This is a separate tuned throughput experiment. It does not establish a speedup over the default-serving comparison above, an off-host capacity estimate, or a maximum for other runtimes. Pipeline latency measures batches; we do not publish it as individual-request latency.

ConfigurationDefault-serving comparisonPeak multi-context serving
Elide throughput635,510 requests/s10,697,938 requests/s peak
JavaScript executionOne context per runtime24 contexts in one Elide process
HTTP loadNo pipeliningPipeline depth 16; 4096 varied URLs
Load generator12 threads; 256 connections16 threads; 256 connections
Warmup / measurement5 seconds / 10 seconds60 seconds / 60 seconds; three fresh servers
HandlerConstant 13-byte Hello, World! responseURL parsing; nine-byte hello-GET response
CPU budget12 physical server cores + SMT; 12 for client12 physical server cores + SMT; 12 for client
SchedulingDefault serving settingsExplicit inline serving; io_uring
NetworkPrivate namespace, loopbackHost loopback
BuildElide 1.6.0, without PythonSame Elide binary; Serial GC

Parallel runtime comparison

We also ran Bun 1.4.3, Deno 2.9.7, and Node.js 24.22.0 LTS against the peak workload above: same server/client CPU masks, 256 connections, sixteen client threads, pipeline depth 16, URL parsing, and nine-byte response. Each configuration had three fresh-server runs, each with 60 seconds warmup and 60 seconds measurement. Runtimes ran sequentially, with configurations interleaved between repeats. These results do not use estimated process scaling or memory penalties.

RuntimeConfigurationPeak requests/sMeasured-run errors
Elide 1.6.024 contexts; published runs10,697,9380
Deno 2.9.724 worker isolates; --parallel4,152,2020
Bun 1.4.324 processes; reusePort3,573,2930
Node.js 24.22.0 LTS24 node:cluster workers2,801,1940
Node.js 24.22.0 LTSOne process; reference217,282139 timeouts across 3 runs

A fresh Elide control run reached 11,416,311 requests/s without errors. The comparison retains the previously published three-run peak instead of replacing it with this single control.

The competitor measurements were:

ConfigurationRun 1Run 2Run 3
Bun, 24 processes3,571,7183,573,2933,560,084
Deno, 24 workers4,123,7134,039,5654,152,202
Node.js, 24 workers2,791,2612,798,6682,801,194
Node.js, one process180,500217,282168,524

Node’s single-process measured runs reported 48, 42, and 49 timeout events respectively; their warmups reported 62, 52, and 64. All other measured runs and warmups reported zero connection, read, write, response-status, and timeout errors. Counts are wrk events, not failed-request rates.

Bun uses Linux port sharing; Deno uses worker isolates within one process; Node uses its built-in cluster coordinator. No external proxy is involved. Node uses its native http API; the other handlers use fetch-style APIs. All parse the URL and construct the response, but default HTTP headers differ. This is a comparison of these configurations, not a ceiling for any runtime. RSS savings were not benchmarked.

Download sources and raw results · Comparison summary

How contexts share a process

elide run --contexts=auto server.mjs

This enables automatic context sizing; --contexts=24 requests a fixed count. The entry module runs in each context. Contexts handle requests concurrently, keep JavaScript globals and module state separate, and share one managed heap and garbage collector. Eligible parsed and JIT-compiled code can be reused across contexts. Sharing does not make ordinary JavaScript objects globally accessible. GC pauses and a process failure can affect all contexts; use external coordination for application data that must be shared.

Architecture comparison

This compares independent-process scaling with Elide’s multi-context model; other runtimes can also offer worker-thread models. Shared infrastructure can reduce duplication, but application work and context-local state still scale with the workload.

ResourceMultiple processesElide contexts
ReplicasOne process eachOne context each
Managed heapSeparate✅ Shared
GC pauses✅ Per process⚠ May span contexts
Parsed / JIT codePer process✅ Shareable code reused
Runtime setupPer process✅ Once per process
Telemetry pipelinePer process✅ Shared batching/export
Request spansPer requestPer request
Process metricsOne stream per process✅ One process stream
ListenerPort sharing / routing✅ One shared listener
I/O resourcesPer processShared topology; per-owner queues
JS globals✅ Isolated✅ Isolated
App client poolsPer replicaPer context unless shared by an API
CoordinationIPC / external storageExplicit APIs / external storage
CPU schedulingProcess / worker threadsContext owner threads
Crash isolation✅ Per process⚠ Shared process
LifecycleManage each process✅ One lifecycle

Telemetry infrastructure is amortized across contexts; per-request instrumentation still costs work. Telemetry export was disabled for these measurements. Neither telemetry savings nor memory savings were measured by the HTTP benchmark.

Multiple runtime processes

Process 1Application stateHeap / GC · parsed and compiled codeTelemetry pipeline · I/O resources
Process 2Application stateHeap / GC · parsed and compiled codeTelemetry pipeline · I/O resources
Process 3Application stateHeap / GC · parsed and compiled codeTelemetry pipeline · I/O resources

Independent heaps and process isolation

One Elide process

Context 1Separate application state
Context 2Separate application state
Context 3Separate application state
Shared across contextsManaged heap + garbage collectorEligible parsed and JIT-compiled codeTelemetry batching / export · listener

Isolated contexts within a shared process

Shared heap does not mean shared JavaScript globals. Architecture comparison; memory and telemetry savings were not measured.

The peak benchmark also explicitly selects inline scheduling and io_uring, uses unlimited memlock, and pipelines requests. The simple command above does not enable all those benchmark settings. The download contains the exact command and environment; performance tuning explains the application-facing context setting. This diagram describes architecture, not measured memory savings.

Benchmark environment

These details apply to the October 15 JavaScript startup and HTTP measurements. The older Python recording has only the machine information listed in its own section; do not infer the same kernel or distro for it.

DetailValue
CPUAMD Ryzen Threadripper PRO 9965WX; 24 physical cores, 48 hardware threads, one socket
Memory128 GB installed; approximately 122.9 GiB visible to Linux
OSUbuntu 26.04.1 LTS, x86-64
KernelLinux 7.0.0-34-generic
CPU policyPerformance governor; frequency boost enabled
Server / client placementTwelve physical cores plus SMT siblings per side; disjoint CPU masks
Clientwrk 4.1.0; exact options in the comparison table and download
Elide1.6.0, release, without optional Python; Serial GC
Binary SHA-256545a4d99db099cf91a35bad8b33bb7e8d1a37a7361c6ba2b62c6e94691fff5c6
Peak resultsRaw reports and environment

Default server CPUs: 0-11,24-35; client: 12-23,36-47. Peak server CPUs: 0-2,6-8,12-14,18-20,24-26,30-32,36-38,42-44; client: 3-5,9-11,15-17,21-23,27-29,33-35,39-41,45-47. The differing masks preserve the same physical-core budget; they are recorded, not assumed interchangeable.

Run them yourself

Download the rerunnable benchmark package (SHA-256). It includes a Makefile, a dependency-free Python runner, JavaScript fixtures, the pipelined wrk client, raw results, and instructions. Bring Linux, Python 3, Make, util-linux, wrk, and your runtime binaries. No runtime binaries are bundled; use the recorded version and checksum for an exact binary match, or record your own version when comparing.

make run ARGS="--mode peak --binary /path/to/elide --contexts 24 --server-cpus YOUR_SERVER_CPUS --client-cpus YOUR_CLIENT_CPUS --out results"

Choose CPU masks for your machine. The download documents locked-memory limits, namespace differences, and commands for the default Elide, Bun and Deno comparison. Results vary with hardware and configuration.

The same files and commands work on any machine; expect different absolute numbers. Performance Tuning covers the setup: real binaries rather than version-manager shims, pinning the server and wrk to separate cores, and a warmup run before measuring.

See also

Чи була ця сторінка корисною?