38 lines
1.1 KiB
Markdown
38 lines
1.1 KiB
Markdown
# Speaker Queue Performance
|
|
|
|
## Goal
|
|
|
|
Reduce render-path latency and variance that can produce audible output glitches.
|
|
|
|
## Benchmark
|
|
|
|
Run `bun run bench:audio` from `packages/voice`.
|
|
|
|
The benchmark compiles the production `SpeakerQueue`, performs one warmup run and seven measured runs, and reports callback latency for a 512-frame pop followed by a same-sized producer push. The queue starts with one second of 24 kHz PCM audio.
|
|
|
|
## Metrics
|
|
|
|
- Primary: `speaker_queue_p99_ns`
|
|
- Secondary: `speaker_queue_median_ns`, `speaker_queue_worst_ns`
|
|
|
|
## Scope
|
|
|
|
- `src/duplex-audio.swift`
|
|
- `scripts/bench-speaker-queue.ts`
|
|
|
|
## Experiments
|
|
|
|
### Baseline: allocating `Data` queue
|
|
|
|
- Median: 3,750 ns
|
|
- p99: 5,833 ns
|
|
- Worst: 92,209 ns median across runs; one run reached 7,497,334 ns
|
|
- Decision: baseline
|
|
|
|
### Experiment 1: preallocated circular queue
|
|
|
|
- Hypothesis: rendering directly from preallocated storage will reduce callback tail latency by avoiding an array allocation and `Data.removeFirst()` on every callback.
|
|
- Median: 1,417 ns, down 62.2%
|
|
- p99: 1,917 ns, down 67.1%
|
|
- Worst: 32,709 ns median across runs, down 64.5%
|
|
- Decision: keep
|