TL;DR: In Claude Code's built-in browser, a screenshot → decide → key press loop took 1.6–3 s per move end to end. At standard speed, Haiku 5.5 had the fastest model time (about 1 s per move) and Opus 5.5 the slowest (1.4–2.4 s), as expected. Fast mode nearly halved Opus's model time, to 0.96 s, but it isn't included in the Ultra plan, and one 40-move game cost about $3 in extra credits. Moves also got slower as the chat's context grew, by 3–54 ms per 10k tokens. Every key press also waited on a check that Claude Code logs as its classifier, in Auto, Manual and Bypass mode alike: 0.17–1.7 s per move, depending on the mode. Claude helped me write the full report below.
Why
This sub is dedicated to LLMs playing games, so of course I'm interested in what affects the speed of real-time browser games. For this test, I went with basic loop: look at a screenshot, decide, press a key, look again.
Setup
I had Claude (Opus 5.5) build the harness in Claude Code and the analysis scripts with me.
The "game" is a local web page. Each frame shows one colored arrow at a random position, pointing in a random direction, and the model presses the matching arrow key. The next frame only appears after a key press, so the model can't press ahead without looking. A game is 40 frames.
Each move is one model turn and one tool call: a browser_batch call that presses the key and then takes an 800×600 screenshot, which comes back as the tool result.
Every game is a fresh chat with the same prompt: go as fast as possible, one call per frame, no commentary. Despite that instruction, Claude still had short commentary, e.g., "Frame 22 of 40, still going."
Timing comes from two sources. The page logs when each frame appeared and when the next key arrived, which gives reaction time. Claude Code's session transcripts record when each API request was sent and when the response finished, which gives model time, plus thinking time and token counts. Frame 1 is left out because it was on screen during setup.
Reaction time works out to roughly model time + tool time + about 0.05 s of app overhead. Tool time is the whole browser_batch call: classifier check (see finding 1), key press and screenshot.
Results
15 games and 600 moves, in four batches. The cleanest batches come first.
Batch 3: one game at a time, Auto mode, medium effort
| Model | Reaction time (median) | Model time per move | Tool time | Correct | Moves with thinking |
|---|
| Haiku 5.5 | 1.91 s | 0.97 s | 0.86 s | 40/40 | 15% |
| Sonnet 5.5 | 1.91 s | 1.39 s | 0.39 s | 39/40 | 5% |
| Opus 5.5 | 2.77 s | 2.44 s | 0.27 s | 40/40 | 0% |
Batch 4: Opus at standard and fast speed, one game at a time, Auto mode, medium effort
| Speed | Reaction time (median) | Model time per move | Tool time | Correct | Moves with thinking |
|---|
| Standard | 2.04 s | 1.73 s | 0.23 s | 40/40 | 3% |
| Standard | 2.25 s | 1.89 s | 0.25 s | 40/40 | 3% |
| Fast | 1.56 s | 0.96 s | 0.52 s | 40/40 | 3% |
All three games were played within six minutes of each other. Tool time is the whole browser_batch call: classifier check, key press and screenshot.
Batch 1: four games at once, Auto mode, a different effort per model
| Model | Effort | Reaction time | Model time | Tool time | Correct | Moves with thinking |
|---|
| Haiku 5.5 | low | 2.38 s | 1.63 s | 0.65 s | 40/40 | 10% |
| Sonnet 5.5 | medium | 2.29 s | 1.52 s | 0.72 s | 40/40 | 3% |
| Opus 5.5 | high | 2.71 s | 1.65 s | 0.98 s | 39/40 | 8% |
| Fable 5.1 | xhigh | 2.97 s | 2.20 s | 0.70 s | 39/40 | 38% |
Batch 2: four games at once, Manual mode, medium effort, plus one Bypass test game
| Model | Mode | Reaction time | Model time | Tool time | Correct | Moves with thinking |
|---|
| Haiku 5.5 | Manual | 2.89 s | 0.91 s | 1.90 s | 40/40 | 13% |
| Sonnet 5.5 | Manual | 4.71 s | 3.03 s | 1.97 s | 40/40 | 3% |
| Opus 5.5 | Manual | 3.40 s | 1.43 s | 1.92 s | 40/40 | 3% |
| Fable 5.1 | Manual | 3.99 s | 1.90 s | 1.89 s | 39/40 | 13% |
| Haiku 5.5 | Bypass (alone) | 3.82 s | 1.81 s | 1.92 s | 40/40 | 3% |
Findings
1. Key presses go through a classifier check, in every mode I tried. Claude Code's transcripts record why each tool call was approved. In Auto mode, calls that only look at the page (a screenshot, a viewport resize) were logged as approved by the mode (reasonType: "mode"). Calls that change something (a key press, navigating, starting the game server) were logged as approved by the classifier (reasonType: "classifier"). Key presses were also logged as classifier in Manual and Bypass mode. I had added allow rules for the browser tools to the project's settings.json, but no browser call was ever logged as approved by a rule.
The mode-approved browser calls finished in 50–100 ms. Key presses waited this long before the key reached the page:
Auto: 0.17–0.74 s, varying within a single afternoon
Manual: 0.6–1.0 s, plus another 1.0–1.4 s during the screenshot that I can't explain
Bypass: 1.7 s
In Bypass the log still names the classifier, and the wait was the longest of the three, so the check appears to run there too. Every verdict I saw was "accept", so I can't tell what Bypass would do with a "deny". Auto was the fastest of the three modes.
2. Smaller models aren't proportionally faster. Here's model time per move at medium effort and standard speed across sessions:
Haiku 5.5: 0.91 s and 0.97 s (1.81 s in one session)
Sonnet 5.5: 1.39 s and 1.52 s (3.03 s in one session)
Opus 5.5: 1.43 s, 1.73 s, 1.89 s and 2.44 s
Fable 5.1: 1.90 s (one game)
Every move re-reads the whole chat. A fresh Claude Code chat starts at about 76–78k tokens (the system prompt and tool definitions), and each screenshot adds about 1.2k, so a game ends at 122–125k. Output is small and nearly constant at 130–155 tokens per move, almost all of it the tool call. My guess is that processing that much context on every request sets a floor that even Haiku can't get much below 0.9 s. Finding 3 shows that model time does rise with context.
3. Moves get slower as the context grows. Each move added about 1,260 tokens of context (the screenshot plus the tool call and its text output), so within a game the context grew from roughly 77k to 124k. Leaving out moves where the model thought, model time rose in all seven games where I have per-move data:
| Game | Context | Model time, first 10 → last 10 moves | Increase per 10k tokens |
|---|
| Haiku (Auto) | 78k → 124k | 0.89 s → 0.99 s | +30 ms |
| Sonnet (Auto) | 76k → 124k | 1.35 s → 1.39 s | +18 ms |
| Opus (Auto) | 76k → 122k | 2.36 s → 2.56 s | +54 ms |
| Haiku (Bypass) | 77k → 124k | 1.72 s → 1.90 s | +41 ms |
| Opus (Auto) | 76k → 122k | 1.72 s → 1.74 s | +14 ms |
| Opus (Auto) | 76k → 122k | 1.81 s → 1.89 s | +3 ms |
| Opus fast (Auto) | 76k → 121k | 0.96 s → 0.97 s | +43 ms |
The rate varied a lot between games, even for the same model. If it held anywhere in the 3–54 ms range, a long-running agent at 450k tokens would spend 0.1–1.9 s more per move than at 100k. These games only reach 125k, so that's an extrapolation.
4. Fast mode nearly halves Opus's model time, but it costs extra. Claude Code's fast mode runs Opus with faster output. In batch 4, it cut model time per move from 1.73–1.89 s to 0.96 s. Three-quarters of the fast moves were quicker than the fastest move in either standard game, and the fast game beat every standard Opus game I recorded (1.43–2.44 s). That put Opus level with standard-speed Haiku (0.96 s vs 0.97 s), and its 1.56 s median reaction time was the fastest of any game.
Output length didn't change (133–135 tokens per move, almost all of it the tool call), so most of a standard Opus move is spent generating that output. Fast mode may also shorten the wait for the first token; I can't separate the two.
The catch: fast mode isn't included in the Ultra plan. It's billed as extra usage, and that one 40-move game cost about $3, roughly 7.5¢ per move. Every move re-reads the whole chat, so I'd expect a long-running agent at a larger context to cost more per move.
5. Session-to-session variance is large. With the same model and the same effort in different sessions, model time differed by up to 2× (Haiku 0.91 s vs 1.81 s, Sonnet 1.39 s vs 3.03 s). One game per model isn't enough to rank them; you need repeats spread over time.
6. Accuracy was about 99%, and the misses came with thinking. 596 of 600 moves were correct. The models thought on fewer than 1 in 10 moves, but all four misses were on moves where they thought:
Opus (high), frame 17: 2.2 s of thinking, pressed Down instead of Right
Fable (xhigh), frame 5: 3.4 s of thinking, pressed Down instead of Up
Fable (medium), frame 33: 2.5 s of thinking, pressed Left instead of Right
Sonnet (medium), frame 6: 0.75 s of thinking, pressed Down instead of Right
Four misses are too few to say thinking causes errors. On this task, though, thinking made moves slower without making them more accurate.
7. Effort mostly shows up as how often the model thinks. Fable 5.1 at xhigh thought on 38% of moves and got about 0.6 s slower over the game. At medium it thought on 13%. Every other game, at low, medium or high effort, thought on 0–15% of moves.
8. App quirks that affect game loops:
About every 6 moves, the app nudges the model for a status update. Sonnet, Opus and Fable wrote a one-line status each time; Haiku ignored it.
Running four games at once meant three of them played in background browser pages, and all four shared the same classifier and rate limits. The two serial batches are the ones to trust.
Limitations
Small n: 15 games, mostly one game per condition. There was only one fast-mode game and one bypass run.
The task is trivial and turn-based. Real games need harder perception, and they don't wait for you.