"The only benchmark that matters is decode tokens per second and time to first token at 90% context — and nobody publishes it." — the founder, 2026-08-26
The Empty-Context Number
Almost every tokens-per-second figure you will ever see — vendor, reviewer, forum — is measured on a short prompt with an empty cache. The lab track's ladder is that kind of number too, deliberately, because it isolates the weights. But nobody uses a model that way. A real session carries a long system prompt, a document, a repository, a conversation; the cache is large before the first useful token, and the two numbers that decide whether the machine is usable are how long you wait for the first token (prefill of everything so far) and how fast the answer streams once it starts (decode with a full cache). The founder's rule is that a benchmark that does not report both at a nearly full window is not measuring the workload. This lesson measures them.
The Curve, Measured
On office, with a 32,768-token window, prompts at 10, 50 and 90% of it, 200 tokens generated, three models chosen to span the cache-to-weights ratio:
| Model | Context | Prompt tokens | TTFT | Prefill tok/s | Decode tok/s | Peak GB | Evidence |
|---|---|---|---|---|---|---|---|
| Llama-3.2-1B (pure GQA, 32 KB/token) | 10% | 3,254 | 0.56 s | 6,572 | 343.6 | 1.63 | measured, office, 2026-09-15 |
| 50% | 16,302 | 2.54 s | 6,562 | 237.4 | 1.97 | measured | |
| 90% | 29,406 | 5.82 s | 5,105 | 208.5 | 2.38 | measured | |
| Qwen3.5-9B (hybrid, 32 KB/token) | 10% | 3,233 | 2.69 s | 1,277 | 94.4 | 6.77 | measured |
| 50% | 16,337 | 13.12 s | 1,259 | 86.3 | 8.13 | measured | |
| 90% | 29,385 | 24.90 s | 1,187 | 78.1 | 9.39 | measured | |
| Qwen3.5-27B (hybrid, 64 KB/token) | 10% | 3,233 | 8.96 s | 367 | 32.3 | 18.21 | measured |
| 50% | 16,337 | 45.94 s | 357 | 29.3 | 20.46 | measured | |
| 90% | 29,385 | 90.38 s | 326 | 27.5 | 22.57 | measured |
Reading the Two Curves
Decode falls from 10% to 90% by 39% for the 1B, 17% for the 9B and 15% for the 27B. The previous lesson predicted the slope from the cache-to-weights ratio — (weights + cache) ÷ weights — as 2.3x more bytes for the 1B, 1.21x for the 9B, 1.13x for the 27B. The 9B and 27B land on the prediction (1.21x and 1.17x measured); the 1B falls short of its 2.3x because a millisecond and a half of fixed overhead per token dilutes a 3-millisecond token. So the founder's sentence from the direction-is-not-timing doctrine — bandwidth divides the slope, it does not change the curve's shape — is exact, with one refinement this quest adds: the shape is the cache-to-weights ratio, and a hybrid architecture has a much flatter one than a pure transformer of the same cache per token.
Time to first token is the number that actually changes a session. Ninety seconds on the 27B at 90% of a 32K window; twenty-five on the 9B; and these are one-shot prefills — a chat client that re-sends the whole history every turn pays a bill of that order every turn, unless the runtime keeps and extends the cache between turns. The physics is unforgiving here: prefill is compute-bound, so the fix is more matrix throughput, which is exactly what Apple's M5 Neural Accelerators are for and exactly what this quest has not measured.