# Benchmarks
`benchmarks/` 下包含三个可比较 harness:
- `benchmarks/rs-netty`:rs-netty echo server/client。
- `benchmarks/tokio`:裸 Tokio echo server/client。
- `benchmarks/netty`:Java Netty echo server/client。
它们对齐了 wire protocols:
- `line`:TCP line echo,`payload + "\n"`。
- `len`:TCP length-field echo,`u32be length + payload`。
- `udp`:UDP datagram echo。
## Directional Snapshot
benchmark 结果是方向性快照,不是通用性能承诺。吞吐、延迟和 RSS 会受 host、NIC、OS、JVM warmup、TCP 设置、payload shape、并发数、in-flight 数、是否 loopback 等因素影响。
README 中的表格来自本仓库 benchmark harness 的一次本地非 loopback 运行。它适合用于理解当前实现的大致量级和相对趋势,不应作为在任意生产环境中的保证。
## Runner
主入口是:
```bash
python3 benchmarks/run.py \
--impls rs-netty tokio netty \
--protocols line len udp \
--connections 100 \
--messages 1000000 \
--payload 128 \
--in-flight 16 \
--output-dir benchmarks/results
```
runner 会:
- 自动选择非 loopback 本地 IPv4,或使用 `--host`。
- 拒绝 `localhost`、`127.0.0.1`、`::1`。
- build selected implementations。
- 启动 server 并采样 server RSS。
- 运行 matching client。
- 解析 `RESULT ...` 行。
- 写出 CSV、日志和图表。
输出包括:
- `results.csv`
- `*.server.out.log`
- `*.server.err.log`
- `*.client.out.log`
- `*.client.err.log`
- `throughput.png`
- `p99_latency.png`
- `server_memory.png`
- `latency_percentiles.png`
开启 `--profile cpu` 时,macOS `sample(1)` 会生成 server sample 和 profile summary。
## Smoke Run
快速冒烟:
```bash
python3 benchmarks/run.py \
--impls rs-netty tokio \
--protocols len \
--connections 2 \
--messages 100 \
--payload 32 \
--in-flight 4
```
如果要包含 Netty,需要本机有 Maven 和 JDK。Rust harness release build 由 runner 自动执行。
## rs-netty Harness Notes
`benchmarks/rs-netty/src/main.rs` 包含:
- `server-rs-line` / `server-rs-line-string`:`LineCodec` + `Handler<String>`。
- `server-rs-line-bytes`:自定义 `BytesLineCodec` + `Handler<Bytes>`。
- `server-rs-line-sync`:await `write_and_flush` 的 line echo 变体。
- `server-rs-len`:自定义组合 codec,内部使用 `LengthFieldBasedFrameDecoder` 和 `LengthFieldPrepender`。
- `server-rs-udp`:`Utf8DatagramCodec` + `DatagramHandler<String>`。
client 端用裸 Tokio 连接、记录 latency percentiles,并打印统一 `RESULT` 行。