Claude Code 到底有多快?每秒令牌數,基於 20,000 輪實測
Claude Code 從不顯示輸出速度,但每個會話轉錄裡都有計算它所需的全部資料。我們用一個 40 行的腳本跑了自己的 319 個會話、20,408 輪、1,200 萬輸出令牌:按中位數,Opus 5 每秒輸出 63 個令牌,Opus 5.5 為 95,Sonnet 5 為 77,而且短回答總是比長回答慢。本文給出方法、腳本、資料,以及快速模式會帶來什麼變化。
Claude Code 在令牌方面告訴你很多:/usage 顯示會話和本週已用多少,AgentsRoom 的會話監視器逐輪統計輸入、輸出、快取讀取和快取寫入,狀態列能顯示上下文視窗的已用比例。但大家一直在找的數字它們都不顯示:你等待時模型每秒實際生成多少令牌。
這個數字沒有被隱藏,只是從沒被算過。每個會話的每條訊息都寫入 ~/.claude/projects/ 下的 JSONL 轉錄,每條助手訊息都帶時間戳和令牌用量。於是我們在自己的機器上算了最近四週。下面是方法、腳本和結果。
Opus 5.5 每秒令牌數:2026 年 10 月 19 日更新
我們在最近四個完整的週上重新做了測量:2026 年 9 月 21 日至 10 月 18 日(UTC)。我們納入了預設轉錄目錄和 AgentsRoom 使用的額外 Claude 設定檔,並且跨檔案只把每個請求計一次。
| Opus 5.5,標準速度 | 測量值 |
|---|---|
| 唯一請求數 | 30,119 |
| 輸出速率中位數 | 89.4 tok/s |
| 加權輸出速率(令牌總數 / 總秒數) | 97.5 tok/s |
| 估計的每輪固定時間 | 1.29 秒 |
| 思考佔輸出令牌的比例 | 42.1% |
固定時間是對耗時秒數與輸出令牌數做最小二乘擬合得到的截距。它是每輪開銷的估計值,不是價格,也不是對首個令牌時間的直接測量。兩個速率都包含思考。
這次更新還修正了計時。直接父記錄可能是技術性的 attachment,包括 deferred_tools_record,它寫入時回答已經在陸續到達。在一個請求中,舊方法用 562 個令牌除以 0.046 秒,得出超過 12,000 tok/s。沿著父記錄鏈回溯到觸發這一輪的使用者訊息或工具結果,能找回約七秒的耗時。經過這一修正和請求去重,這個時間段內沒有任何 Opus 5.5 請求超過 400 tok/s;我們並沒有過濾掉高速率。
下面九月的表格仍是最初的測量。其中 94.9 tok/s 的中位數和 109.3 tok/s 的加權速率使用的是舊計時和另一組樣本,所以這個差異並不能證明 Opus 5.5 變慢了。這些數字描述的是我們的工作負載、網路和轉錄時間戳,而不是單獨隔離的模型基準。
資料從哪裡來
Claude Code 為每個會話在 ~/.claude/projects/<project slug>/<session id>.jsonl 寫一個檔案,每個事件一行。這裡要看的是助手訊息,只留有用欄位後是這樣的:
{
"type": "assistant",
"uuid": "24d13076-…",
"parentUuid": "d4447285-…",
"requestId": "req_011CepWq…",
"timestamp": "2026-09-07T18:00:08.412Z",
"message": {
"model": "claude-opus-5",
"usage": {
"input_tokens": 2,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 51591,
"output_tokens": 200,
"output_tokens_details": { "thinking_tokens": 0 },
"speed": "standard"
}
}
}
四點讓測量成為可能:
timestamp在內容塊追加時寫入,所以一輪最後一個塊記錄的是流結束時刻。parentUuid指向前一個事件,它可能是響應過程中寫入的技術性 attachment。沿鏈跳過attachment、system和progress事件,回溯到觸發這一輪的使用者訊息或工具結果;它的時間戳可近似視為一輪的開始時刻。requestId把一次 API 呼叫的各個塊歸到一起。一輪先寫文字再呼叫工具,會產生兩行requestId和usage都相同的助手記錄,所以令牌按請求計一次,不按行計。usage.output_tokens是請求的總輸出,包括思考;output_tokens_details.thinking_tokens說明其中多少是思考。
檔案裡沒有首個令牌的時間。能測的是整輪:從請求離開你的機器到最後一個令牌到達。這也是你等待時唯一感受得到的數字,我們就用它。
方法
對每個 requestId:取帶有它的第一行和最後一行助手記錄,從第一行讀 usage,沿其父記錄鏈回溯到觸發這一輪的使用者訊息或工具結果,再用輸出令牌數除以到最後一行助手記錄為止的耗時秒數。每個請求跨檔案只計一次,並按模型和速度設定分別報告。這些時間戳包含本地開銷,無法單獨分離出 API 的生成時間。
我們剔除無輸出令牌、找不到觸發記錄、時長不為正或超過十五分鐘的輪次。下面的腳本使用本次帶日期更新的時間視窗,按 UTC 計,包含開始日、不包含結束日。修改 START 和 END 即可測量其他時段。
更新後的腳本需要 Python 3.10 或更高版本,無需額外依賴。在哪都能執行,會讀取預設專案和本地額外的 Claude 設定檔,不會上傳其內容。
import json, glob, os, statistics as st
from datetime import datetime
from collections import defaultdict
START, END = "2026-09-21", "2026-10-19" # UTC, end exclusive
PATTERNS = ("~/.claude/projects/*/*.jsonl",
"~/.agentsroom/claude-profiles/*/projects/*/*.jsonl")
def ts(s): return datetime.fromisoformat(s.replace("Z", "+00:00")).timestamp()
def read_session(path):
by_uuid, groups = {}, defaultdict(list)
with open(path) as fh:
for line in fh:
try: o = json.loads(line)
except ValueError: continue
if "uuid" in o: by_uuid[o["uuid"]] = o
msg = o.get("message") or {}
if o.get("type") == "assistant" and msg.get("usage") and o.get("timestamp"):
groups[o.get("requestId") or o["uuid"]].append(o)
return by_uuid, groups
def trigger(first, by_uuid):
parent, visited = by_uuid.get(first.get("parentUuid")), set()
while parent and parent.get("type") in ("attachment", "system", "progress"):
uid = parent.get("uuid")
if uid in visited: return None
visited.add(uid)
parent = by_uuid.get(parent.get("parentUuid"))
return parent if parent and parent.get("type") == "user" else None
by_model, seen = defaultdict(list), set()
for pattern in PATTERNS:
for path in glob.glob(os.path.expanduser(pattern)):
by_uuid, groups = read_session(path)
for rid, blocks in groups.items():
first, last = blocks[0], blocks[-1]
if rid in seen or not START <= first["timestamp"] < END: continue
usage = first["message"]["usage"]
out, parent = usage.get("output_tokens", 0), trigger(first, by_uuid)
if not parent or not parent.get("timestamp") or out <= 0: continue
dur = ts(last["timestamp"]) - ts(parent["timestamp"])
if not 0 < dur <= 900: continue
seen.add(rid)
thinking = (usage.get("output_tokens_details") or {}).get("thinking_tokens", 0)
key = first["message"].get("model"), usage.get("speed", "unknown")
by_model[key].append((out, dur, thinking))
for (model, speed), rows in sorted(by_model.items(), key=lambda kv: -len(kv[1])):
outputs, durations, thinking = zip(*rows)
median = st.median(o / d for o, d, _ in rows)
weighted = sum(outputs) / sum(durations)
overhead = st.linear_regression(outputs, durations).intercept if len(set(outputs)) > 1 else float("nan")
print(f"{model} {speed}: turns={len(rows)} median={median:.1f} "
f"weighted={weighted:.1f} tok/s overhead={overhead:.2f}s "
f"thinking={100 * sum(thinking) / sum(outputs):.1f}%")
weighted 列是令牌總數除以總秒數,對應長時間的自主執行;中位數對應單個互動輪次。
實測數字
法國的一台 Mac,319 個轉錄,2026 年 8 月 27 日至 9 月 25 日的 20,408 輪,45 小時生成共產出 1,200 萬輸出令牌。每輪都是標準速度(快速模式見下文)。轉錄裡以 Claude Code 寫入的名稱出現五個模型。
| 模型 | 輪數 | 中位數 tok/s | 第 25 至 75 百分位 | 加權 tok/s |
|---|---|---|---|---|
| Opus 5 | 16,708 | 62.7 | 51.5 至 71.8 | 69.8 |
| Opus 5.5 | 1,102 | 94.9 | 80.9 至 109.0 | 109.3 |
| Sonnet 5 | 426 | 77.0 | 62.6 至 91.5 | 87.0 |
| Fable 5.1 | 2,070 | 75.1 | 66.1 至 82.9 | 80.0 |
| Opus 4.8 | 102 | 60.9 | 49.1 至 66.5 | 64.2 |
先看兩點。第一,Opus 5.5 不是比 Opus 5 快一點:中位數快一半,加權數字快 57%,長輪次佔比也高得多。第二,同一模型內部的差異比模型之間更大:Opus 5 第 25 百分位的一輪每秒輸出 51 個令牌,第 75 百分位是 72。原因是輪次大小,值得單獨一節。
短回答總是更慢
還是 Opus 5,按一輪中的輸出令牌數切分:
| 一輪中的輸出令牌數 | 輪數 | 中位數 tok/s | 耗時中位數 |
|---|---|---|---|
| 1 至 99 | 1,854 | 42.1 | 1.9 秒 |
| 100 至 499 | 10,743 | 60.6 | 3.4 秒 |
| 500 至 1,999 | 3,512 | 72.8 | 11.1 秒 |
| 2,000 及以上 | 599 | 78.4 | 38.8 秒 |
同一模型、同一個月、同一台機器,一行的回答和長回答速率相差一倍。模型在長輪次裡並沒有輸出得更快。每一輪在首個令牌出現前都要付一筆固定成本:請求發出,提示詞被處理,流開始。80 令牌的一輪裡,這筆成本佔耗時的三分之一;3,000 令牌的一輪裡,它淹沒在噪聲中。
對耗時與輸出令牌數做最小二乘擬合,就能分開兩者。斜率是流式傳輸速度,截距是固定成本:
| 模型 | 每輪固定成本 | 流式傳輸速度 |
|---|---|---|
| Opus 5 | 1.03 秒 | 81.6 tok/s |
| Opus 5.5 | 1.10 秒 | 148.9 tok/s |
| Sonnet 5 | 0.45 秒 | 94.9 tok/s |
| Fable 5.1 | 0.99 秒 | 84.8 tok/s |
| Opus 4.8 | 1.40 秒 | 69.9 tok/s |
所以工具呼叫密集的會話感覺慢時,問題很少在模型吞吐量,而在輪次數量。逐個讀取十二個檔案的代理要付十二次固定成本;同一代理用一次批次呼叫讀取,只付一次。這和降低令牌成本是同一個道理:更少更大的輪次,而非更快的模型。
語料中最長的一輪是 Opus 5 在 236 秒內輸出 21,332 個令牌,端到端每秒 90 個:固定成本攤薄後,這是我們在該模型標準速度下觀察到的上限。
思考令牌也是輸出令牌
output_tokens 包含模型在回答前的思考,output_tokens_details.thinking_tokens 告訴你其中有多少。我們的語料中,思考佔 Opus 5 全部輸出的 30%,Opus 5.5 為 18%,Fable 5.1 為 36%,Sonnet 5 為 54%,Sonnet 5 大多在審查任務中以較高推理強度執行。
這對解讀慢的輪次很重要。一輪思考八秒、只列印兩行,不是模型慢,而是產出了 600 個你沒看到的令牌。按每個令牌算,帶思考的輪次比不帶的略快:Opus 5 上每秒 67 對 57 個令牌,因為它們更長,更能攤薄固定成本。會話拖沓而你不需要推理過程時,該調的是推理強度,不是模型。
快取讀取改變的是帳單,不是速率
Claude Code 幾乎每輪都命中提示詞快取:Opus 5 的 16,680 輪中只有 130 輪 cache_read_input_tokens 為零,都是會話的第一輪。輸出 100 到 500 令牌的輪次中,命中快取的中位速度為每秒 60.6 個令牌,耗時 3.4 秒;未命中的為 58.0,耗時 3.7 秒。差別真實但很小,且在固定成本上,不在流式傳輸速度上。快取關乎你攜帶的上下文的價格,所以 AgentsRoom 終端裡的令牌計數器把快取讀取和快取寫入分成兩個數字顯示。
整個月都很穩定
累計數字可能掩蓋漂移,所以我們也看了 Opus 5 在最常見的 100 到 500 令牌輪次上的每週中位數:逐週為每秒 63.6、64.1、60.9、61.7、56.9 個令牌,最後一週尚未結束,為 68.7。57 到 69 之間,沒有趨勢。如果某個下午會話變慢,怪罪模型前,不妨只對那天跑一下腳本。
快速模式改變什麼,以及我們沒測到的
每個 usage 塊都有 speed 欄位,我們的 20,408 個全是 standard。Anthropic 為 Claude Opus 提供快速模式,在 CLI 中用 /fast 或在使用者設定中用 "fastMode": true 開啟,模型最多快 2.5 倍,但每令牌更貴:Opus 5.5 上每百萬輸入令牌 8 美元、每百萬輸出令牌 40 美元,Opus 5 和 Opus 4.8 上為 10 美元和 50 美元。Pro 和 Max 套餐中它計入用量額度,不佔訂閱視窗;Sonnet 和 Haiku 不支援,開啟會切換到 Opus。提示詞旁的閃電圖示表示已開啟。
我們沒付費用它,沒有實測數字可與官方的 2.5 倍對照。如果你在用,同一個腳本就能告訴你效果:按 usage["speed"] == "fast" 過濾輪次,比較中位數。把數字發給我們吧。
這對我們執行代理意味著什麼
三點,都與選更快的模型無關。
第一點關於預期。如果七個代理的夜間執行產出兩百萬個輸出令牌,就是每秒 70 個令牌下八小時的生成量,分攤在並行的代理之間。知道速率,才能判斷計劃任務能否在下一個開始前完成。
第二點關於輪次。每輪固定的那一秒,在 30 令牌的確認和 3,000 令牌的 diff 上都一樣。每走一小步都先問、或逐個讀檔案的代理,時間都花在這一秒上。所以我們在無人值守的代理的提示詞裡寫上「互不依賴的讀取要合併成一批」。
第三點關於計數器該顯示什麼。AgentsRoom 的會話監視器顯示令牌和快取,會話變重時變紅;它不顯示速率,測完之後,我們也不確定它該不該顯示。速率是模型和輪次大小的屬性,不是會話的屬性,開發者需要的數字就在上面的表格裡。所以這是一篇文章,而非一個小元件。
常見問題
Claude Opus 5.5 每秒生成多少個令牌?
在我們 2026 年 10 月 19 日更新的測量中,Claude Opus 5.5 在 9 月 21 日至 10 月 18 日的 30,119 個唯一請求上,輸出令牌中位數為每秒 89.4 個,全部為標準速度。輸出令牌總數除以總耗時秒數為 97.5 tok/s。思考佔輸出令牌的 42.1%。這些是來自我們自己會話轉錄的端到端測量,不是通用的流式傳輸速度基準。
Claude Code 每秒生成多少個令牌?
在我們 2026 年 8 月 27 日至 9 月 25 日記錄的 20,408 輪中:Opus 5 的輸出令牌中位數為每秒 63 個(用全部令牌除以全部秒數則為 69),Opus 5.5 為 95(109),Sonnet 5 為 77(87),Fable 5.1 為 75(80),Opus 4.8 為 61(64)。這些數字算的是整輪,從請求離開你的機器到最後一個令牌流式傳輸完畢,正是你實際等待的時間。
/usage 或 /cost 會顯示每秒令牌數嗎?
不會。/usage 顯示套餐配額、5 小時視窗和每週視窗,以及上下文視窗的已用比例;/cost 是 /usage 的別名。兩者都不顯示速率。速度只存在於 ~/.claude/projects/ 下的會話轉錄中,每條助手訊息都帶時間戳和輸出令牌數,本文腳本讀的正是它們。
為什麼短回答感覺比長回答更慢?
因為每一輪在首個令牌到達前都要付一筆固定成本:上傳請求、處理提示詞、啟動流。我們的資料中,這筆開銷在 Opus 5 和 Opus 5.5 上約一秒,Sonnet 5 上約半秒。80 令牌的回答中,一秒佔整輪的三分之一,測得速率降到每秒 40 個令牌;3,000 令牌的回答中,同樣的一秒幾乎消失,速率升到 80 以上。流式傳輸速度本身是恆定的。
思考令牌算在速度裡嗎?
算。每條訊息的 usage 塊報告 output_tokens及其 output_tokens_details.thinking_tokens 明細,思考令牌是 output_tokens 的一部分。在我們的語料中,思考令牌佔 Opus 5 全部輸出的 30%,Opus 5.5 為 18%,Sonnet 5 為 54%,後者多以較高推理強度執行。思考很久的一輪並不慢,它在生成你看不到的令牌。
提示詞快取會讓 Claude Code 更快嗎?
輸出速率不會提高。100 到 500 令牌的輪次中,命中提示詞快取時 Opus 5 中位速度為每秒 60.6 個令牌,未命中時為 58.0,整輪耗時 3.4 秒對 3.7 秒。快取影響的是你為上下文付的錢,不是回答的速度。
Claude Code 的快速模式是什麼,能快多少?
Claude Opus 的一種配置,Anthropic 稱最多快 2.5 倍,但每令牌更貴:Opus 5.5 上每百萬輸入令牌 8 美元、每百萬輸出令牌 40 美元,Opus 5 和 Opus 4.8 上為 10 美元和 50 美元,計入用量額度而非訂閱視窗。用 /fast 切換,開啟後提示詞旁出現小閃電圖示。我們測的 20,408 輪沒有一輪用快速模式(所有轉錄都寫著 speed: standard),所以沒有實測數字;本文數字均為標準速度。
下載 AgentsRoom
在一個視窗中執行你所有專案的所有 AI 代理。
配套應用:隨時隨地監控你的 Agent
使用 Claude、Codex、Antigravity CLI 或其他 AI 提供商。
把 Bug 和需求直接傳送到您的公開待辦清單。
繼續閱讀
減少 MCP 令牌消耗:我們如何把工具定義削減 60%
代理能呼叫的每個 MCP 工具,都是模型可能在每次請求時讀取的一段 JSON。我們的工具大約有 95,000 個令牌。本文介紹如何在兩分鐘內測量你自己的工具,我們在不刪除任何工具的前提下削減了什麼,以及防止它再次膨脹的預算檢查。
閱讀全文Claude 的令牌是什麼,又是怎麼運作的?我們數了 38 億個
令牌是詞的一個片段,Claude 會統計四種令牌:輸入、快取寫入、快取讀取和輸出。我們統計了自己 30 天的 Claude Code 會話,共 38 億令牌:98% 是從快取裡重新讀取的對話,Claude 寫出的只佔 0.3%。每種令牌的成本、為什麼會話每多一輪就更重,以及 5 小時視窗到底在計量什麼。
閱讀全文Antigravity Remote Control:在手機上能做什麼,不能做什麼
Google在2026年8月21日為Antigravity 2.0和Antigravity CLI推出了Remote Control,這個名字的搜尋量說明大家想知道它到底是什麼。下面是它能做的事,已於9月22日對照文件核實:設定裡的開關和agy remote-control命令,用Google帳號登入的網頁儀表板,新增到主螢幕後能收到推送通知,多台機器集中在一個切換器裡,以及三個要緊的限制(只支援Antigravity,每台機器一個守護程序,設定留在CLI上)。然後講AgentsRoom手機遙控器怎樣覆蓋另外15個CLI,以及兩者怎樣配合。
閱讀全文
