Skip to content

Add Express: the most popular Node.js web framework (~69k ⭐)#68

Open
BennyFranciscus wants to merge 2 commits intoMDA2AV:mainfrom
BennyFranciscus:add-express
Open

Add Express: the most popular Node.js web framework (~69k ⭐)#68
BennyFranciscus wants to merge 2 commits intoMDA2AV:mainfrom
BennyFranciscus:add-express

Conversation

@BennyFranciscus
Copy link
Collaborator

Express.js

The OG. The framework that put Node.js web development on the map. ~69k stars, millions of weekly downloads, and still the most widely used backend framework in the JS ecosystem.

Setup

  • Express 5.x (latest stable) with Node.js 22
  • Cluster mode — one worker per CPU core
  • better-sqlite3 for /db (mmap, read-only)
  • HTTP/2 on port 8443 (native http2 module)
  • Pre-computed gzip for /compression

Why this matters

HttpArena already has bare node, fastify, ultimate-express, hono, and bun — but not vanilla Express. That's wild. This is the comparison everyone wants:

  • Express vs Fastify — the classic Node.js framework showdown
  • Express vs ultimate-express — how does the original compare to its high-perf reimplementation?
  • Express vs bare node — how much overhead does the middleware layer actually add?

Express isn't going to win any speed records, and that's fine — it's the baseline that every Node.js developer measures against. You can't have a complete JS benchmark suite without it.

cc @wesleytodd @blakeembrey @dougwilson — thought it'd be cool to see how Express stacks up in HttpArena!

@BennyFranciscus BennyFranciscus requested a review from MDA2AV as a code owner March 17, 2026 14:02
@MDA2AV
Copy link
Owner

MDA2AV commented Mar 17, 2026

/benchmark

@github-actions
Copy link

🚀 Benchmark run triggered for express (all profiles). Results will be posted here when done.

@github-actions
Copy link

Benchmark Results

Framework: express | Profile: all profiles

express / baseline / 512c (p=1, r=0, cpu=unlimited)
  Best: 360231 req/s (CPU: 10966.4%, Mem: 10.8GiB) ===

express / baseline / 4096c (p=1, r=0, cpu=unlimited)
  Best: 351654 req/s (CPU: 10885.6%, Mem: 11.4GiB) ===

express / baseline / 16384c (p=1, r=0, cpu=unlimited)
  Best: 325634 req/s (CPU: 9960.0%, Mem: 12.2GiB) ===

express / pipelined / 512c (p=16, r=0, cpu=unlimited)
  Best: 435299 req/s (CPU: 10899.0%, Mem: 11.9GiB) ===

express / pipelined / 4096c (p=16, r=0, cpu=unlimited)
  Best: 435344 req/s (CPU: 11021.2%, Mem: 12.5GiB) ===

express / pipelined / 16384c (p=16, r=0, cpu=unlimited)
  Best: 419778 req/s (CPU: 10041.9%, Mem: 12.7GiB) ===

express / limited-conn / 512c (p=1, r=10, cpu=unlimited)
  Best: 204324 req/s (CPU: 6534.2%, Mem: 10.6GiB) ===

express / limited-conn / 4096c (p=1, r=10, cpu=unlimited)
  Best: 203029 req/s (CPU: 6597.2%, Mem: 10.6GiB) ===

express / json / 4096c (p=1, r=0, cpu=unlimited)
  Best: 297563 req/s (CPU: 10717.2%, Mem: 11.6GiB) ===

express / json / 16384c (p=1, r=0, cpu=unlimited)
  Best: 276647 req/s (CPU: 10873.1%, Mem: 12.3GiB) ===

express / upload / 64c (p=1, r=0, cpu=unlimited)
  Best: 945 req/s (CPU: 6055.0%, Mem: 7.3GiB) ===

express / upload / 256c (p=1, r=0, cpu=unlimited)
  Best: 980 req/s (CPU: 6341.5%, Mem: 8.8GiB) ===

express / upload / 512c (p=1, r=0, cpu=unlimited)
  Best: 936 req/s (CPU: 7098.7%, Mem: 9.1GiB) ===

express / compression / 4096c (p=1, r=0, cpu=unlimited)
  Best: 12453 req/s (CPU: 12138.3%, Mem: 8.6GiB) ===

express / compression / 16384c (p=1, r=0, cpu=unlimited)
  Best: 12030 req/s (CPU: 11355.2%, Mem: 8.6GiB) ===

express / noisy / 512c (p=1, r=0, cpu=unlimited)
  Best: 264820 req/s (CPU: 10961.8%, Mem: 11.0GiB) ===

express / noisy / 4096c (p=1, r=0, cpu=unlimited)
  Best: 258154 req/s (CPU: 10785.7%, Mem: 11.7GiB) ===

express / noisy / 16384c (p=1, r=0, cpu=unlimited)
  Best: 227021 req/s (CPU: 9367.7%, Mem: 12.3GiB) ===

express / mixed / 4096c (p=1, r=5, cpu=unlimited)
  Best: 36742 req/s (CPU: 11156.3%, Mem: 9.6GiB) ===

express / mixed / 16384c (p=1, r=5, cpu=unlimited)
  Best: 32577 req/s (CPU: 9742.1%, Mem: 9.7GiB) ===

express / baseline-h2 / 256c (p=1, r=0, cpu=unlimited)
  Best: 1388080 req/s (CPU: 11810.5%, Mem: 14.5GiB) ===

express / baseline-h2 / 1024c (p=1, r=0, cpu=unlimited)
  Best: 1140080 req/s (CPU: 11741.6%, Mem: 15.7GiB) ===

express / static-h2 / 256c (p=1, r=0, cpu=unlimited)
  Best: 640920 req/s (CPU: 10700.1%, Mem: 12.5GiB) ===

express / static-h2 / 1024c (p=1, r=0, cpu=unlimited)
  Best: 521140 req/s (CPU: 10852.5%, Mem: 14.6GiB) ===
Full log
Main benchmark duration is over for thread #61. Stopping all clients.
Main benchmark duration is over for thread #103. Stopping all clients.
Stopped all clients for thread #Stopped all clients for thread #50
Stopped all clients for thread #61
80
Stopped all clients for thread #103
Main benchmark duration is over for thread #87. Stopping all clients.
Main benchmark duration is over for thread #Stopped all clients for thread #87
108. Stopping all clients.
Stopped all clients for thread #108
Main benchmark duration is over for thread #Main benchmark duration is over for thread #79115. Stopping all clients.. Stopping all clients.

Main benchmark duration is over for thread #Stopped all clients for thread #79
71. Stopping all clients.
Stopped all clients for thread #Main benchmark duration is over for thread #24. Stopping all clients.
115
Stopped all clients for thread #Stopped all clients for thread #24
Main benchmark duration is over for thread #92. Stopping all clients.
Stopped all clients for thread #92
71
Main benchmark duration is over for thread #102. Stopping all clients.
Stopped all clients for thread #102
Main benchmark duration is over for thread #67. Stopping all clients.
Main benchmark duration is over for thread #94. Stopping all clients.
Stopped all clients for thread #67
Stopped all clients for thread #94
Main benchmark duration is over for thread #93. Stopping all clients.
Main benchmark duration is over for thread #Stopped all clients for thread #93
72. Stopping all clients.
Stopped all clients for thread #72
Main benchmark duration is over for thread #105. Stopping all clients.
Stopped all clients for thread #105
Main benchmark duration is over for thread #81. Stopping all clients.
Stopped all clients for thread #81
Main benchmark duration is over for thread #36. Stopping all clients.
Main benchmark duration is over for thread #95. Stopping all clients.Stopped all clients for thread #36

Stopped all clients for thread #95
Main benchmark duration is over for thread #86. Stopping all clients.
Stopped all clients for thread #86
Main benchmark duration is over for thread #75. Stopping all clients.
Stopped all clients for thread #75
Main benchmark duration is over for thread #84. Stopping all clients.
Main benchmark duration is over for thread #32. Stopping all clients.
Stopped all clients for thread #84
Stopped all clients for thread #32
Main benchmark duration is over for thread #38. Stopping all clients.
Stopped all clients for thread #38
Main benchmark duration is over for thread #16. Stopping all clients.
Stopped all clients for thread #16
Main benchmark duration is over for thread #118. Stopping all clients.
Stopped all clients for thread #118
Main benchmark duration is over for thread #1. Stopping all clients.
Main benchmark duration is over for thread #121. Stopping all clients.Main benchmark duration is over for thread #
101Main benchmark duration is over for thread #41. Stopping all clients.
Stopped all clients for thread #1
Stopped all clients for thread #41
Stopped all clients for thread #121
Main benchmark duration is over for thread #43. Stopping all clients.
Main benchmark duration is over for thread #85. Stopping all clients.
Stopped all clients for thread #43
Stopped all clients for thread #85
Main benchmark duration is over for thread #27. Stopping all clients.
Stopped all clients for thread #27
Main benchmark duration is over for thread #2. Stopping all clients.
Stopped all clients for thread #2
Main benchmark duration is over for thread #68. Stopping all clients.
Main benchmark duration is over for thread #97. Stopping all clients.
Main benchmark duration is over for thread #89. Stopping all clients.
Stopped all clients for thread #68
Stopped all clients for thread #89
Stopped all clients for thread #97
Main benchmark duration is over for thread #65. Stopping all clients.
Main benchmark duration is over for thread #117. Stopping all clients.
Main benchmark duration is over for thread #21. Stopping all clients.
Stopped all clients for thread #117
Stopped all clients for thread #65
Stopped all clients for thread #21
Main benchmark duration is over for thread #109. Stopping all clients.
Stopped all clients for thread #109
Main benchmark duration is over for thread #100. Stopping all clients.
. Stopping all clients.Main benchmark duration is over for thread #23. Stopping all clients.
Main benchmark duration is over for thread #122. Stopping all clients.
Stopped all clients for thread #100

Main benchmark duration is over for thread #Stopped all clients for thread #122
Main benchmark duration is over for thread #104. Stopping all clients.
Stopped all clients for thread #Main benchmark duration is over for thread #31. Stopping all clients.
Main benchmark duration is over for thread #Main benchmark duration is over for thread #23Stopped all clients for thread #31
4935Stopped all clients for thread #Stopped all clients for thread #101. Stopping all clients.
. Stopping all clients.
Main benchmark duration is over for thread #116. Stopping all clients.
Main benchmark duration is over for thread #125. Stopping all clients.

104Main benchmark duration is over for thread #
123. Stopping all clients.
Stopped all clients for thread #Main benchmark duration is over for thread #Stopped all clients for thread #74. Stopping all clients.Stopped all clients for thread #35

Stopped all clients for thread #49123

125Stopped all clients for thread #74

Stopped all clients for thread #
116
110. Stopping all clients.
Main benchmark duration is over for thread #20. Stopping all clients.
Main benchmark duration is over for thread #28. Stopping all clients.
Stopped all clients for thread #20
Stopped all clients for thread #28
Main benchmark duration is over for thread #82. Stopping all clients.
Stopped all clients for thread #82
Main benchmark duration is over for thread #62. Stopping all clients.
Main benchmark duration is over for thread #69. Stopping all clients.
Stopped all clients for thread #62
Stopped all clients for thread #69
Main benchmark duration is over for thread #99. Stopping all clients.
Main benchmark duration is over for thread #120. Stopping all clients.
Stopped all clients for thread #120
Main benchmark duration is over for thread #48. Stopping all clients.
Stopped all clients for thread #48
Main benchmark duration is over for thread #76. Stopping all clients.
Stopped all clients for thread #110
Stopped all clients for thread #76
Main benchmark duration is over for thread #40. Stopping all clients.
Stopped all clients for thread #40
Main benchmark duration is over for thread #111. Stopping all clients.
Stopped all clients for thread #111
Main benchmark duration is over for thread #113. Stopping all clients.
Stopped all clients for thread #113
Stopped all clients for thread #99
Main benchmark duration is over for thread #64. Stopping all clients.
Stopped all clients for thread #64
Main benchmark duration is over for thread #98. Stopping all clients.
Main benchmark duration is over for thread #57. Stopping all clients.
Main benchmark duration is over for thread #Main benchmark duration is over for thread #114. Stopping all clients.
56. Stopping all clients.
Stopped all clients for thread #Main benchmark duration is over for thread #114
Stopped all clients for thread #56
Stopped all clients for thread #57
Stopped all clients for thread #98
112. Stopping all clients.
Stopped all clients for thread #112
Main benchmark duration is over for thread #51. Stopping all clients.
Main benchmark duration is over for thread #66. Stopping all clients.
Stopped all clients for thread #51
Stopped all clients for thread #66
Main benchmark duration is over for thread #96. Stopping all clients.
Main benchmark duration is over for thread #106. Stopping all clients.
Stopped all clients for thread #96
Stopped all clients for thread #106
Main benchmark duration is over for thread #44. Stopping all clients.
Main benchmark duration is over for thread #63. Stopping all clients.
Stopped all clients for thread #63
Stopped all clients for thread #44
Main benchmark duration is over for thread #47. Stopping all clients.
Stopped all clients for thread #47
Main benchmark duration is over for thread #17. Stopping all clients.
Stopped all clients for thread #17
Main benchmark duration is over for thread #25. Stopping all clients.
Main benchmark duration is over for thread #Stopped all clients for thread #25
90. Stopping all clients.
Stopped all clients for thread #90
Main benchmark duration is over for thread #126. Stopping all clients.
Main benchmark duration is over for thread #119. Stopping all clients.
Main benchmark duration is over for thread #91. Stopping all clients.
Stopped all clients for thread #126
Stopped all clients for thread #91
Stopped all clients for thread #119
Main benchmark duration is over for thread #13. Stopping all clients.
Stopped all clients for thread #13
Main benchmark duration is over for thread #70. Stopping all clients.
Stopped all clients for thread #70
Main benchmark duration is over for thread #73. Stopping all clients.
Stopped all clients for thread #73
Main benchmark duration is over for thread #29. Stopping all clients.
Stopped all clients for thread #29
Main benchmark duration is over for thread #39. Stopping all clients.
Stopped all clients for thread #39

finished in 5.07s, 521140.00 req/s, 8.12GB/s
requests: 2605700 total, 2708100 started, 2605700 done, 2605700 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 2672400 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 40.59GB (43578022231) total, 26.72MB (28012765) headers (space savings 89.45%), 40.48GB (43462806207) data
                     min         max         mean         sd        +/- sd
time for request:     9.91ms    501.51ms    180.20ms     54.33ms    76.20%
time for connect:     4.29ms       1.42s    202.46ms    319.35ms    91.89%
time to 1st byte:    23.55ms       1.48s    258.30ms    318.73ms    91.89%
req/s           :     280.01      819.82      508.84       85.19    65.53%
  CPU: 10852.5% | Mem: 14.6GiB

=== Best: 521140 req/s (CPU: 10852.5%, Mem: 14.6GiB) ===
[dry-run] Results not saved (use --save to persist)
httparena-bench-express
httparena-bench-express
[skip] express does not subscribe to baseline-h3
[skip] express does not subscribe to static-h3
[skip] express does not subscribe to unary-grpc
[skip] express does not subscribe to unary-grpc-tls
[skip] express does not subscribe to echo-ws
[restore] Restoring CPU governor to powersave...

@BennyFranciscus
Copy link
Collaborator Author

Full benchmark results look great — Express is showing solid all-around numbers for a Node.js framework:

Standout numbers:

  • 1.4M baseline-h2 at 256c — Node's native HTTP/2 module performing really well here
  • 360K baseline / 435K pipelined — consistent with the earlier dry-run
  • Upload at 936-980 req/s — actually one of the better upload numbers we've seen (most frameworks struggle here)
  • Noisy profile 265K — clean error handling, minimal degradation

Interesting comparison with Hono (also Node.js on Bun):

  • Express baseline 360K vs Hono 662K — Bun's event loop is ~1.8x faster for raw throughput
  • But Express compression at 12.5K vs Hono 13K — once you're CPU-bound on gzip, the runtime gap nearly disappears
  • Upload numbers are almost identical (980 vs 383) — actually Express wins handily here, likely because Express.js body parsing is more mature
  • H2 numbers are nearly identical (~1.4M) — both running on the same underlying Node/Bun HTTP/2 path

Memory usage is higher than Go/Rust entries but that's expected for a V8 runtime. The numbers tell an honest story.

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.

2 participants