Files
ytplayer/alt/rust/BENCH.md
2026-10-14 01:17:30 +08:00

2.4 KiB

Local backend A/B benchmark

Measured 2026-10-14 on the same Linux host, Rust optimized release build vs Bun/Hono, loopback HTTP, Chromium not involved in the load generator. Both services served the identical frontend/ tree and used a seeded SQLite search row plus a 1 MiB cached-media fixture. The benchmark ran sequentially, four routes, 750 ms per route/concurrency. responseBytes are Node fetch's decoded response-body bytes, not raw compressed wire bytes. These are short smoke measurements; use a longer run and production-like media/network before drawing capacity conclusions.

Command:

BENCH_QUERY=rust-backend-parity-20261014 TEST_MEDIA_ID=dQw4w9WgXcQ node alt/bench.mjs http://127.0.0.1:3101 --duration-ms=750
BENCH_QUERY=rust-backend-parity-20261014 TEST_MEDIA_ID=dQw4w9WgXcQ node alt/bench.mjs http://127.0.0.1:3100 --duration-ms=750

Each cell is requests/sec (p95 ms); all 32 route/concurrency runs reported zero errors.

Concurrency Backend /api/version CSS asset Cached search 1 MiB media range
1 Bun 2,425 (0.7) 521 (3.4) 1,041 (2.5) 612 (3.5)
1 Rust release 1,844 (0.9) 665 (2.0) 2,269 (0.6) 480 (3.9)
10 Bun 7,008 (2.7) 1,179 (12.4) 1,623 (17.2) 685 (27.0)
10 Rust release 3,872 (3.3) 1,131 (12.9) 4,228 (3.1) 599 (27.4)
50 Bun 10,033 (11.3) 1,279 (44.3) 1,783 (54.7) 769 (105.5)
50 Rust release 4,267 (17.4) 1,199 (52.7) 4,733 (14.5) 689 (135.4)
200 Bun 9,947 (33.7) 1,333 (203.0) 1,863 (161.0) 1,029 (266.3)
200 Rust release 4,396 (59.8) 1,328 (202.7) 4,533 (59.9) 863 (644.7)

The Rust backend led the cached-search route in this short run and was close on static CSS at high concurrency. Bun served /api/version and large media ranges faster at high concurrency; Rust's 1 MiB Range p95 widened to 644.7 ms at 200 connections. The shared in-memory static snapshot and boot-time Brotli/gzip encodings avoided disk lookup and per-request recompression, but the Range implementation still streams through Tokio file reads. No result implies production superiority.

Bun's yt-dlp Python worker could not import the system yt_dlp package on this host. Bench routes were seeded and do not exercise YouTube upstream latency or media encoding. Docker is unavailable on this host, so image build/compose smoke was not run.