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 轉錄,每條助手訊息都帶時間戳和令牌用量。於是我們在自己的機器上算了最近四週。下面是方法、腳本和結果。
資料從哪裡來
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指向上一行,即模型正在回應的使用者訊息或工具結果。它的時間戳即請求發出時刻。requestId把一次 API 呼叫的各個塊歸到一起。一輪先寫文字再呼叫工具,會產生兩行requestId和usage都相同的助手記錄,所以令牌按請求計一次,不按行計。usage.output_tokens是請求的總輸出,包括思考;output_tokens_details.thinking_tokens說明其中多少是思考。
檔案裡沒有首個令牌的時間。能測的是整輪:從請求離開你的機器到最後一個令牌到達。這也是你等待時唯一感受得到的數字,我們就用它。
方法
對每個 requestId:取帶有它的第一行和最後一行助手記錄,從第一行讀 usage,找到第一行的父記錄,再用輸出令牌數除以父記錄與最後一行時間戳之間的秒數。然後按模型看分佈,不看單一平均值,因為 40 秒和 2 秒的輪次不是一回事。
我們剔除了無輸出令牌、時長不為正(恢復的會話裡,父記錄可能晚於子記錄)和超過十五分鐘的輪次,後者是中斷的會話,不是長回答。此外沒有任何過濾。
腳本是 40 行無依賴的 Python,在哪都能執行,會讀取機器上的所有專案。
import json, glob, os, statistics as st
from datetime import datetime
from collections import defaultdict
def ts(s): return datetime.fromisoformat(s.replace("Z", "+00:00")).timestamp()
turns = []
for path in glob.glob(os.path.expanduser("~/.claude/projects/*/*.jsonl")):
by_uuid, groups, order = {}, {}, []
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"):
rid = o.get("requestId") or o["uuid"]
if rid not in groups: groups[rid] = []; order.append(rid)
groups[rid].append(o)
for rid in order:
first, last = groups[rid][0], groups[rid][-1]
out = first["message"]["usage"].get("output_tokens", 0)
parent = by_uuid.get(first.get("parentUuid"))
if not parent or not parent.get("timestamp") or out <= 0: continue
dur = ts(last["timestamp"]) - ts(parent["timestamp"])
if 0 < dur <= 900:
turns.append((first["message"].get("model"), out, dur))
by_model = defaultdict(list)
for model, out, dur in turns: by_model[model].append((out, dur))
for model, rows in sorted(by_model.items(), key=lambda kv: -len(kv[1])):
rates = [o / d for o, d in rows]
print(f"{model:18s} turns={len(rows):6d} median={st.median(rates):5.1f} tok/s "
f"weighted={sum(o for o, _ in rows) / sum(d for _, d in rows):5.1f} tok/s")
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 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 和需求直接傳送到您的公開待辦清單。
繼續閱讀
把 PDF 轉成 Markdown 以節省 LLM token:MarkItDown 實戰指南
直接把 PDF 餵給 Claude 或任何 LLM 都會悄悄燒掉大量 token:每一頁都會被額外轉成圖片。先用微軟免費開源工具 MarkItDown 把檔案轉成 Markdown,token 帳單最多可降低 80%。完整指南涵蓋 CLI、Python 與 MCP 配置。
閱讀全文如何與 AI 程式設計代理溝通:Claude、Codex、Antigravity、Grok Build
程式碼不再是瓶頸,溝通才是。本文介紹如何與 AI 代理 Claude、Codex、Antigravity 和 Grok Build 協作,讓你更快、更精準地交付,同時減少 token 消耗。
閱讀全文Antigravity Remote Control:在手機上能做什麼,不能做什麼
Google在2026年8月21日為Antigravity 2.0和Antigravity CLI推出了Remote Control,這個名字的搜尋量說明大家想知道它到底是什麼。下面是它能做的事,已於9月22日對照文件核實:設定裡的開關和agy remote-control命令,用Google帳號登入的網頁儀表板,新增到主螢幕後能收到推送通知,多台機器集中在一個切換器裡,以及三個要緊的限制(只支援Antigravity,每台機器一個守護程序,設定留在CLI上)。然後講AgentsRoom手機遙控器怎樣覆蓋另外13個CLI,以及兩者怎樣配合。
閱讀全文