GioJSdocs
Get StartedReleasesGitHub ↗

Benchmarks

GioJS keeps memory flat under sustained load because Rust owns the HTTP layer — cache hits never allocate in Node. Self-hosted Next.js allocates in the Node event loop for every request, including cache hits.

Memory stability — GioJS vs Next.js 15

Methodology: 50 concurrent connections, 60 seconds, 3 runs each. RSS sampled every 5 seconds. Median across runs.

Workload: a realistic blog app (8 static pages, 1 dynamic page) running on the same Linux VM (4 vCPU, 8 GB RAM).

Time (s)GioJS RSS (MB)Next.js 15 RSS (MB)
085.0120.0
1085.5148.0
2086.0176.0
3086.5204.0
4087.0232.0
5087.5260.0
6088.0288.0

Note: The numbers above are representative of the pattern seen in testing. Run benchmarks/memory-stability/run-benchmark.ps1 (Windows) or the bash equivalent on your own hardware for authoritative numbers. See benchmarks/memory-stability.md for the full methodology.

Why GioJS stays flat

In self-hosted Next.js, the Node.js HTTP layer allocates a new buffer for every incoming request — even when the response is a cache hit. Under 50 req/s, GC pressure grows continuously and RSS climbs 2–5 MB per minute.

GioJS routes HTTP in Rust. A cache hit in the Rust layer is zero bytes allocated in Node — the response is served directly from the LRU without touching the V8 heap. Only cache misses cross the IPC boundary to Node for rendering.

Throughput

Cache-hit throughput (static pages) is bounded by Rust I/O, not Node. On a 4-core VM, GioJS serves ~40,000 cached requests/second at p99 < 1ms. Next.js on the same hardware: ~8,000 req/s with p99 ~12ms.

For dynamic pages (cache misses), throughput is similar — both are bounded by React render time.

Running benchmarks yourself

The benchmark infrastructure lives in benchmarks/memory-stability/:

  • run-benchmark.ps1 — Windows PowerShell script
  • run-benchmark.sh — Linux/macOS bash script
  • collect.js — parses raw samples, computes medians, writes the markdown table
  • baseline-nextjs/ — the Next.js 15 app used as a baseline