blob: b1eff1c8eb21d30b29f92131d006f5c9fcaed897 [file] [log] [blame] [view]
# Ruby Protocol Benchmarks
This directory holds a small harness for quick Ruby protocol benchmarks.
Use it to spot read and write regressions in tree.
## Quick Start
Run the script with plain `ruby` from the repo root.
```sh
ruby test/rb/benchmarks/protocol_benchmark.rb
```
This runs the full benchmark set:
- Ruby binary
- Ruby compact
- Ruby JSON
- Header binary
- Header compact
- Header zlib
- C binary, if `thrift_native.so` loads
## Options
Use flags or env vars to tune a run.
```sh
ruby test/rb/benchmarks/protocol_benchmark.rb --large-runs 1 --small-runs 10000
```
- `--json`
- `THRIFT_BENCHMARK_LARGE_RUNS`
- `THRIFT_BENCHMARK_SMALL_RUNS`
- `THRIFT_BENCHMARK_SKIP_NATIVE=1`
- `THRIFT_BENCHMARK_SCENARIOS`
```sh
ruby test/rb/benchmarks/protocol_benchmark.rb --json > benchmark.json
```
> [!NOTE]
> `--json` keeps the warm-up pass, but only prints measured results.
> [!TIP]
> Set `THRIFT_BENCHMARK_SKIP_NATIVE=1` to force a pure-Ruby run.
## Scenario IDs
Use `--scenarios` or `THRIFT_BENCHMARK_SCENARIOS` to run only part of the matrix.
```sh
ruby test/rb/benchmarks/protocol_benchmark.rb --scenarios rb-bin-write-large,rb-json-read-large,hdr-zlib-read-small
```
Each ID has four parts:
- family: `rb`, `c`, or `hdr`
- protocol: `bin`, `cmp`, `json`, or `zlib`
- operation: `write` or `read`
- size: `large` or `small`
### Full Table
| ID | Family | Protocol | Operation | Size |
| --- | --- | --- | --- | --- |
| `rb-bin-write-large` | Ruby | binary | write | large |
| `rb-bin-read-large` | Ruby | binary | read | large |
| `c-bin-write-large` | C native | binary | write | large |
| `c-bin-read-large` | C native | binary | read | large |
| `rb-cmp-write-large` | Ruby | compact | write | large |
| `rb-cmp-read-large` | Ruby | compact | read | large |
| `rb-json-write-large` | Ruby | JSON | write | large |
| `rb-json-read-large` | Ruby | JSON | read | large |
| `rb-bin-write-small` | Ruby | binary | write | small |
| `rb-bin-read-small` | Ruby | binary | read | small |
| `c-bin-write-small` | C native | binary | write | small |
| `c-bin-read-small` | C native | binary | read | small |
| `rb-cmp-write-small` | Ruby | compact | write | small |
| `rb-cmp-read-small` | Ruby | compact | read | small |
| `rb-json-write-small` | Ruby | JSON | write | small |
| `rb-json-read-small` | Ruby | JSON | read | small |
| `hdr-bin-write-small` | Header | binary | write | small |
| `hdr-bin-read-small` | Header | binary | read | small |
| `hdr-cmp-write-small` | Header | compact | write | small |
| `hdr-cmp-read-small` | Header | compact | read | small |
| `hdr-zlib-write-small` | Header | zlib | write | small |
| `hdr-zlib-read-small` | Header | zlib | read | small |
> [!NOTE]
> Native-only IDs fail if `thrift_native.so` is not available.
## Reference
### What It Measures
- Large jobs serialize and deserialize one nested `Nested4` payload by default.
- Small jobs serialize and deserialize many `OneOfEach` payloads.
- Read jobs use payloads built before timing so they measure read cost, not payload construction.
- Header jobs flush after each struct so reads benchmark framed messages, not a buffered write that was never emitted.
### Files
- `protocol_benchmark.rb`: benchmark harness and scenario definitions
- `../fixtures/structs.rb`: sample structs used by the benchmark
### Notes
This harness is for quick in-tree checks.
Use `--json` if you want structured output for scripts, result diffs, or branch comparisons.
Run it more than once if you want a wider sample.