Skip to content

hyper-express: the eight profiles it was missing - #1248

Open
MDA2AV wants to merge 2 commits into
mainfrom
feat/hyper-express-missing-profiles
Open

hyper-express: the eight profiles it was missing#1248
MDA2AV wants to merge 2 commits into
mainfrom
feat/hyper-express-missing-profiles

Conversation

@MDA2AV

@MDA2AV MDA2AV commented Aug 21, 2026

Copy link
Copy Markdown
Owner

static, static-tls, json-tls, async-db, crud, fortunes, api-4 and
api-16. Tests go from 6 to 14.

The entry carried four endpoints — /pipeline, /json/:count, /upload,
/baseline11. api-4 and api-16 rotate over /baseline11, /json and
/async-db, so wiring Postgres brings all three profiles with it.

json-tls / static-tls

hyper-express takes TLS material through the uWS options at construction rather
than through a separate https server, so 8081 is a second Server carrying the
same routes. The route table moved into registerRoutes() and both servers are
built from it — no second copy of the handlers. Every worker binds 8081 exactly
as they all bind 8080, so the listener is spread across the cluster rather than
parked on one process, which is the failure #1245 fixed on quarkus.

static

Bodies are read from disk on every request, per the arena rule that applies in
every mode. Startup scans names, existing pre-compressed variants and content
types only — no file data is held in memory.

crud

Cache-aside on Redis through ioredis, one connection per worker so the cache is
shared across the cluster rather than being a per-worker map, 200ms TTL, explicit
delete on update.

fortunes

Emitted by hand rather than through a template engine, which tuned mode
explicitly allows. The handler still queries per request, appends the runtime
row, sorts ordinally and escapes < > & " ' — the seed's row 11 carries
a <script> tag and the profile's load-bearing check is that it leaves as text.

Validation

64 passed, 0 failed, including every new profile:

static      20 files verified, 15 compressed / 5 skipped, 404 path
static-tls  20 files verified, 15 compressed / 5 skipped, 404 path
json-tls    protocol negotiation, response schema, Content-Type
async-db    4 limits verified, Content-Type, empty range
fortunes    <tr> count=202, runtime row, XSS escape, body size=24437B
crud        list, read, cache-aside MISS->HIT, 404, POST 201, PUT + invalidate

🤖 Generated with Claude Code

static, static-tls, json-tls, async-db, crud, fortunes, api-4 and api-16. The
entry carried four endpoints; api-4 and api-16 rotate over /baseline11, /json
and /async-db, so wiring Postgres brings all three profiles with it.

json-tls and static-tls listen on 8081. hyper-express takes TLS material through
the uWS options at construction rather than through a separate https server, so
the port is a second Server carrying the same routes - the route table moved
into registerRoutes() and both servers are built from it. Every worker binds
8081 the same way they all bind 8080, so the listener is spread across the
cluster rather than parked on one process.

Static file bodies are read from disk on every request; startup scans names,
pre-compressed variants and content types only.

crud runs cache-aside on Redis through ioredis, one connection per worker so the
cache is shared across the cluster, with a 200ms TTL and an explicit delete on
update.

fortunes is emitted by hand rather than through a template engine, which tuned
mode allows. The handler still queries per request, appends the runtime row,
sorts ordinally and escapes < > & " ' - the seed's row 11 carries a <script> tag
and the profile's load-bearing check is that it leaves as text.

Validation: 64 passed, 0 failed.
@MDA2AV

MDA2AV commented Aug 21, 2026

Copy link
Copy Markdown
Owner Author

/benchmark --save

@github-actions

Copy link
Copy Markdown
Contributor

👋 Benchmark request received. A collaborator will review and approve the run.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: hyper-express | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 1,175,888 6756.1% 5.6GiB +0.4% -3.4%
baseline 4096 1,167,706 6554.9% 5.6GiB +0.9% -1.8%
pipelined 512 3,505,715 6501.1% 2.1GiB -0.1% ~0%
pipelined 4096 3,516,134 6440.4% 2.3GiB -0.1% +4.5%
limited-conn 512 964,073 6177.4% 6.1GiB -0.6% +1.7%
limited-conn 4096 1,082,245 6429.5% 5.9GiB +1.9% +1.7%
json 4096 860,837 6615.5% 1.8GiB -0.6% ~0%
json-comp 512 421,586 5904.9% 8.8GiB -1.3% ~0%
json-comp 4096 437,977 6306.8% 9.0GiB -0.9% +3.4%
json-comp 16384 436,029 6587.2% 8.7GiB -0.7% +3.6%
json-tls 4096 801,048 6632.6% 1.8GiB NEW NEW
upload 32 2,064 2933.8% 5.8GiB -0.3% ~0%
upload 256 2,178 5924.3% 6.2GiB -0.7% ~0%
api-4 256 32,019 398.9% 385MiB NEW NEW
api-16 1024 113,098 1485.8% 1.4GiB NEW NEW
static 1024 510,027 6510.6% 2.5GiB NEW NEW
static 4096 570,792 6512.1% 3.6GiB NEW NEW
static 6800 568,500 6550.3% 3.6GiB NEW NEW
static-tls 1024 410,499 6522.0% 2.4GiB NEW NEW
static-tls 4096 449,618 6485.4% 3.6GiB NEW NEW
static-tls 6800 446,114 6511.7% 3.6GiB NEW NEW
async-db 1024 199,327 6106.7% 2.9GiB NEW NEW
crud 4096 351,171 4618.9% 7.0GiB NEW NEW
fortunes 1024 83,872 6534.6% 3.8GiB NEW NEW
Full log
=== Best: 199327 req/s (CPU: 6106.7%, Mem: 2.9GiB) ===
[info] input BW: 13.31MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/hyper-express.json
httparena-bench-hyper-express
httparena-bench-hyper-express

==============================================
=== hyper-express / crud / 4096c (tool=gcannon) ===
==============================================
[info] resetting postgres for a clean per-profile baseline
[info] starting postgres sidecar
httparena-postgres
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   11.91ms   12.20ms   16.20ms   26.30ms   46.80ms

  5143915 requests in 15.00s, 5143649 responses
  Throughput: 342.86K req/s
  Bandwidth:  121.48MB/s
  Status codes: 2xx=5143649, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 5143646 / 5143649 responses (100.0%)
  Reconnects: 23086
  Per-template: 284680,302816,296508,264667,263263,263965,251826,239113,239432,238841,239109,239175,238707,239201,239642,239602,246084,274597,272802,269616
  Per-template-ok: 284680,302816,296508,264667,263263,263965,251826,239113,239432,238841,239109,239175,238707,239201,239642,239602,246084,274597,272802,269616
[info] CPU 5000.5% | Mem 7.3GiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   11.77ms   12.10ms   15.80ms   22.10ms   34.00ms

  5197430 requests in 15.00s, 5197416 responses
  Throughput: 346.44K req/s
  Bandwidth:  122.38MB/s
  Status codes: 2xx=5197416, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 5197407 / 5197416 responses (100.0%)
  Reconnects: 23135
  Per-template: 283068,305295,304273,282425,269991,271597,264083,239660,239410,239590,240179,238873,238463,239022,239513,239925,244343,274428,273350,269919
  Per-template-ok: 283068,305295,304273,282425,269991,271597,264083,239660,239410,239590,240179,238873,238463,239022,239513,239925,244343,274428,273350,269919
[info] CPU 4573.5% | Mem 7.3GiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   11.60ms   12.00ms   15.60ms   21.70ms   28.30ms

  5267846 requests in 15.00s, 5267578 responses
  Throughput: 351.13K req/s
  Bandwidth:  124.05MB/s
  Status codes: 2xx=5267578, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 5267566 / 5267578 responses (100.0%)
  Reconnects: 23614
  Per-template: 283809,309504,307941,288541,272869,273883,269106,243559,243217,242680,242339,243050,243305,243456,243361,243434,247451,277362,275268,273431
  Per-template-ok: 283809,309504,307941,288541,272869,273883,269106,243559,243217,242680,242339,243050,243305,243456,243361,243434,247451,277362,275268,273431
[info] CPU 4618.9% | Mem 7.0GiB

=== Best: 351171 req/s (CPU: 4618.9%, Mem: 7.0GiB) ===
[info] input BW: 30.14MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/hyper-express.json
httparena-bench-hyper-express
httparena-bench-hyper-express

==============================================
=== hyper-express / fortunes / 1024c (tool=gcannon) ===
==============================================
[info] resetting postgres for a clean per-profile baseline
[info] starting postgres sidecar
httparena-postgres
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/fortunes
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   11.87ms   11.10ms   16.80ms   30.00ms   48.60ms

  397060 requests in 5.00s, 397060 responses
  Throughput: 79.38K req/s
  Bandwidth:  1.83GB/s
  Status codes: 2xx=397060, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 397060 / 397060 responses (100.0%)
[info] CPU 6492.6% | Mem 3.5GiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/fortunes
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   11.03ms   10.80ms   15.90ms   21.60ms   26.10ms

  419364 requests in 5.00s, 419364 responses
  Throughput: 83.84K req/s
  Bandwidth:  1.94GB/s
  Status codes: 2xx=419364, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 419364 / 419364 responses (100.0%)
[info] CPU 6534.6% | Mem 3.8GiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/fortunes
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  unlimited (keep-alive)
  Expected:  200
  Duration:  5s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   10.99ms   10.70ms   15.30ms   20.80ms   40.30ms

  418707 requests in 5.00s, 418707 responses
  Throughput: 83.71K req/s
  Bandwidth:  1.93GB/s
  Status codes: 2xx=418707, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 418707 / 418707 responses (100.0%)
[info] CPU 6510.7% | Mem 4.0GiB

=== Best: 83872 req/s (CPU: 6534.6%, Mem: 3.8GiB) ===
[info] saved results/fortunes/1024/hyper-express.json
httparena-bench-hyper-express
httparena-bench-hyper-express
[info] skip: hyper-express does not subscribe to baseline-h2
[info] skip: hyper-express does not subscribe to static-h2
[info] skip: hyper-express does not subscribe to baseline-h2c
[info] skip: hyper-express does not subscribe to json-h2c
[info] skip: hyper-express does not subscribe to baseline-h3
[info] skip: hyper-express does not subscribe to static-h3
[info] skip: hyper-express does not subscribe to gateway-64
[info] skip: hyper-express does not subscribe to gateway-h3
[info] skip: hyper-express does not subscribe to production-stack
[info] skip: hyper-express does not subscribe to unary-grpc
[info] skip: hyper-express does not subscribe to unary-grpc-tls
[info] skip: hyper-express does not subscribe to stream-grpc
[info] skip: hyper-express does not subscribe to stream-grpc-tls
[info] skip: hyper-express does not subscribe to echo-ws
[info] skip: hyper-express does not subscribe to echo-ws-pipeline
[info] skip: hyper-express does not subscribe to echo-ws-limited
[info] rebuilding site/data/*.json
[purged stale] zix-grpc.json (zix-grpc)
[purged stale] zix-ws.json (zix-ws)
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/hyper-express.json - 24 new, 24 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant