Compiler-hidden suspension over readiness-driven I/O; bounded task workers for general work.
JavaScript callbacks and promises execute around the event loop with a worker pool for selected operations.
Commercial product comparison · Updated 2026-07-26
Grayworth recommendation
Choose Gray when a backend needs the immediacy developers like in Node.js without making the application carry the event loop's continuation discipline. Gray's tested qualifying ceiling reached 60k/s on both published routes, versus 12k/s plaintext and 20k/s JSON for Node.js in the same fixture.1
01 / At a glance
Compiler-hidden suspension over readiness-driven I/O; bounded task workers for general work.
JavaScript callbacks and promises execute around the event loop with a worker pool for selected operations.
Typed or typeless Gray with classes, structs, collections, BigInt, modules, and native server APIs.
JavaScript or TypeScript with an exceptionally broad package ecosystem.
Live, Adaptive, and Static modes in one runtime/toolchain.
Node process plus framework, package tree, and deployment supervisor.
Grayworth owns the complete server product, release, and support path.
Node applications combine the runtime with selected frameworks, packages, and process tooling.
02 / Under pressure
Gray qualified through 60k requests/s on plaintext and JSON. Node.js qualified through 12k/s on plaintext and 20k/s on JSON under the same threshold.
| Fixture | Gray | Node.js |
|---|---|---|
| Plaintext | 60k/s · p99 85.76 ms | 12k/s · p99 10.04 ms |
| JSON | 60k/s · p99 81.15 ms | 20k/s · p99 72.13 ms |
| 20k plaintext | 99.5% delivery · p99 2.25 ms | 99.5% delivery · p99 123.8 ms |
| 45k JSON | 99.5% delivery · p99 5.90 ms | 50.0% delivery · overloaded |
1 Same-host qualification. Full environment, threshold, and scope appear in Claims & details below.
Node's event loop is the reason it can serve many I/O-bound clients with a small number of threads. The design becomes fragile when a callback or worker task performs too much variable-duration work. Node's own guidance emphasizes that a blocked event loop cannot give other clients a turn.
Gray also uses a readiness reactor, but its public server contract is built around normal-looking handlers. A PostgreSQL call can suspend the handler, release the reactor, and resume from the exact continuation when the socket is ready. That design aims to keep the event-loop discipline in the compiler and runtime rather than in every route.
At 20k requested plaintext requests per second, Node delivered 99.5% but corrected p99 reached 123.8 ms, just beyond the qualification condition. Gray delivered 99.5% with p99 2.25 ms. On JSON, Node still qualified at 20k/s with p99 72.13 ms.
At 30k/s Node no longer delivered 95% of either route, while Gray remained inside the condition. This is evidence about the exact minimal servers in the published image. Express, Fastify, cluster mode, worker topology, payload complexity, and application dependencies would create different curves.
Move the Node routes where CPU time, database waits, tail latency, or worker pressure already has a cost. Gray can own authentication, request handling, data access, and deployment as one server product instead of another JavaScript process stack.
A production move should improve the whole route: response behavior, cold start, p50/p99/p99.9, memory, cancellation, deployment, and operating cost.
The published result is a same-host qualification for the declared minimal Node.js and Gray fixtures. It measures the requested-rate points, exact responses, delivery ratio, and corrected p99 in that environment; it does not rank every framework, deployment topology, payload, or production application built with Node.js.
Treat the evidence as a decision input, then reproduce the relevant contract with your own payloads, dependencies, concurrency, failure behavior, and operating limits before committing to a migration.
Gray centralizes the server path under one commercial runtime. Node.js may instead bring established ecosystem assets, platform reach, libraries, hiring depth, or operating practices that are material to the service.
The practical comparison includes observability, incident response, deployment, support boundaries, dependency ownership, and the cost of maintaining an additional runtime, not only handler throughput.
Start at a stable Node.js service boundary with an exact HTTP, data, and failure contract. Port one route or worker to Gray, keep the existing implementation live, and make rollback a tested operation.
Qualify behavior before volume: response bytes, authentication, validation, cancellation, timeouts, transactions, traces, dashboards, and on-call ownership should all be explicit before traffic moves.
Choose Gray when the route is pressure-sensitive and the value of an integrated language, runtime, networking, data path, replacement model, and tooling outweighs the cost of a focused port.
Keep Node.js when its ecosystem, compatibility commitments, operational model, or already-sufficient service envelope is the more valuable constraint. A credible decision names the workload, acceptance thresholds, owner, and rollback condition.
Decision guide
Migration
Preserve the HTTP contract first; translate one handler, not the whole application.
Map I/O to Gray's cooperative native calls and let the handler continuation suspend automatically.
Use Gray Bytes for arbitrary binary data and String only for valid UTF-8.
Compare one Gray worker with the exact Node topology before scaling either side.
Questions
On Grayworth's published server tests, yes. Gray qualified at 60k/s on plaintext and JSON; Node.js qualified at 12k/s and 20k/s respectively.¹
Yes. Gray owns readiness, suspension, cancellation, and resumption inside the runtime, so handlers stay direct while the server continues serving other connections.
Yes when the backend's required packages and integrations are available through Gray or a service boundary. Start with the routes where performance and operating simplicity create the largest return.
It proves the published minimal Gray and Node.js fixtures met the stated same-host qualification points. It does not prove the same outcome for every framework, dependency graph, payload, or production topology.
Choose one stable Node.js boundary, preserve its contract, run Gray beside it, and compare correctness, tail latency, capacity, memory, failure handling, deployment, and rollback under production-shaped traffic before moving the route.
Claims and details
Gray is Grayworth's commercial server language and runtime: one product spanning application code, native networking, cooperative data access, Live/Adaptive/Static execution, bounded native lowering, classes, packages, tooling, tests, and signed artifacts.
Published and reviewed by Grayworth Engineering · 2026-07-26
Related decisions
Evaluate Gray for a selected service or workload.