引用
TSRPC WebSocket Performance Benchmark - Node.js 24
Test Environment
| Item | Value |
|------|-------|
| Node.js | v24.15.0 |
| Platform | Windows 10.0.22631 (x64) |
| TSRPC | ^3.4.21 |
| Transport | WebSocket, JSON mode |
| Server Port | 3000 |
| API Endpoint | Send (req: {content: string}, res: {time: Date}) |
| Note | Each request triggers a broadcastMsg to all connected clients |
Method A: tsrpc-cli dev (ts-node Runtime Compilation)
Single Client Results (1 WebSocket Connection, Varying Concurrency)
| Concurrency | Total Requests | Duration (ms) | QPS | Avg Latency (ms) | Min (ms) | Max (ms) | P50 (ms) | P90 (ms) | P99 (ms) | Success/Error |
|-------------|---------------|---------------|------|-------------------|----------|----------|----------|----------|----------|---------------|
| 1 | 10000 | 1765 | 5665.72 | 0.17 | 0 | 10 | 0 | 1 | 1 | 10000/0 |
| 10 | 10000 | 794 | 12594.46 | 0.64 | 0 | 2 | 1 | 1 | 1 | 10000/0 |
| 50 | 10000 | 657 | 15220.7 | 2.39 | 0 | 5 | 3 | 3 | 4 | 10000/0 |
| 100 | 10000 | 645 | 15503.88 | 4.53 | 1 | 8 | 5 | 6 | 7 | 10000/0 |
| 200 | 10000 | 637 | 15698.59 | 8.66 | 3 | 14 | 10 | 12 | 13 | 10000/0 |
Peak QPS: ~15,699 (Concurrency=200)
Multi Client Results (Multiple WebSocket Connections)
| Clients | Concurrency | Total Requests | Duration (ms) | QPS | Avg Latency (ms) | Min (ms) | Max (ms) | P50 (ms) | P90 (ms) | P99 (ms) | Success/Error |
|---------|-------------|---------------|---------------|------|-------------------|----------|----------|----------|----------|----------|---------------|
| 5 | 50 | 10000 | 1125 | 8888.89 | 5.05 | 0 | 42 | 4 | 8 | 29 | 10000/0 |
| 10 | 100 | 10000 | 1744 | 5733.94 | 16.21 | 0 | 141 | 14 | 17 | 112 | 10000/0 |
| 20 | 200 | 10000 | 3000 | 3333.33 | 53.09 | 0 | 473 | 42 | 58 | 372 | 10000/0 |
Method B: Compiled JS (tsrpc-cli build -> node dist/index.js)
Single Client Results (1 WebSocket Connection, Varying Concurrency)
| Concurrency | Total Requests | Duration (ms) | QPS | Avg Latency (ms) | Min (ms) | Max (ms) | P50 (ms) | P90 (ms) | P99 (ms) | Success/Error |
|-------------|---------------|---------------|------|-------------------|----------|----------|----------|----------|----------|---------------|
| 1 | 10000 | 1727 | 5790.39 | 0.17 | 0 | 6 | 0 | 1 | 1 | 10000/0 |
| 10 | 10000 | 761 | 13140.6 | 0.59 | 0 | 2 | 1 | 1 | 1 | 10000/0 |
| 50 | 10000 | 618 | 16181.23 | 2.21 | 0 | 4 | 2 | 3 | 3 | 10000/0 |
| 100 | 10000 | 621 | 16103.06 | 4.3 | 1 | 9 | 5 | 6 | 7 | 10000/0 |
| 200 | 10000 | 615 | 16260.16 | 8.35 | 3 | 14 | 10 | 12 | 13 | 10000/0 |
Peak QPS: ~16,260 (Concurrency=200)
Multi Client Results (Multiple WebSocket Connections)
| Clients | Concurrency | Total Requests | Duration (ms) | QPS | Avg Latency (ms) | Min (ms) | Max (ms) | P50 (ms) | P90 (ms) | P99 (ms) | Success/Error |
|---------|-------------|---------------|---------------|------|-------------------|----------|----------|----------|----------|----------|---------------|
| 5 | 50 | 10000 | 1098 | 9107.47 | 4.74 | 0 | 40 | 3 | 10 | 28 | 10000/0 |
| 10 | 100 | 10000 | 1680 | 5952.38 | 15.19 | 0 | 145 | 14 | 17 | 111 | 10000/0 |
| 20 | 200 | 10000 | 2890 | 3460.21 | 53.22 | 1 | 530 | 51 | 56 | 320 | 10000/0 |
Comparison: ts-node vs Compiled JS (Node.js 24)
| Concurrency/Config | ts-node QPS | Compiled JS QPS | Diff |
|---------------------|-------------|-----------------|------|
| 1 Client, Conc=1 | 5665.72 | 5790.39 | +2.2% |
| 1 Client, Conc=10 | 12594.46 | 13140.6 | +4.3% |
| 1 Client, Conc=50 | 15220.7 | 16181.23 | +6.3% |
| 1 Client, Conc=100 | 15503.88 | 16103.06 | +3.9% |
| 1 Client, Conc=200 | 15698.59 | 16260.16 | +3.6% |
| 5 Clients, Conc=50 | 8888.89 | 9107.47 | +2.4% |
| 10 Clients, Conc=100 | 5733.94 | 5952.38 | +3.8% |
| 20 Clients, Conc=200 | 3333.33 | 3460.21 | +3.8% |
Comparison with Node.js 22 (ts-node)
| Concurrency/Config | Node.js 22 QPS | Node.js 24 (ts-node) | Node.js 24 (compiled) | vs N22 (compiled) |
|---------------------|----------------|-----------------------|------------------------|-------------------|
| 1 Client, Conc=1 | 5694.76 | 5665.72 | 5790.39 | +1.6% |
| 1 Client, Conc=10 | 12300.12 | 12594.46 | 13140.6 | +6.8% |
| 1 Client, Conc=50 | 14577.26 | 15220.7 | 16181.23 | +10.4% |
| 1 Client, Conc=100 | 14925.37 | 15503.88 | 16103.06 | +7.8% |
| 1 Client, Conc=200 | 15479.88 | 15698.59 | 16260.16 | +5.0% |
| 5 Clients, Conc=50 | 8968.61 | 8888.89 | 9107.47 | +1.5% |
| 10 Clients, Conc=100 | 5854.8 | 5733.94 | 5952.38 | +1.7% |
| 20 Clients, Conc=200 | 3445.9 | 3333.33 | 3460.21 | +0.4% |
Observations
-
Compiled JS vs ts-node: Compiled JS consistently outperforms ts-node by 2~6% across all scenarios, confirming that pre-compiled JS is more production-realistic and slightly faster.
-
Node.js 24 vs 22: With compiled JS, Node.js 24 shows clear improvement at moderate concurrency (Conc=50: +10.4%, Conc=100: +7.8%). Multi-client results are comparable.
-
Recommendation: For benchmarking, use tsrpc-cli build + node dist/index.js to get results closer to production performance. tsrpc-cli dev adds ts-node overhead that slightly underestimates server throughput.
-
Zero error rate across all test scenarios.
Benchmark Commands
Method A (ts-node):
npx tsrpc-cli dev # start server
npx ts-node src/bench.ts # run benchmark
Method B (compiled JS, recommended):
npx tsrpc-cli build # compile
node dist/index.js # start server
node dist/bench.js # run benchmark