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 516,70862.751.5 至 71.869.8
Opus 5.51,10294.980.9 至 109.0109.3
Sonnet 542677.062.6 至 91.587.0
Fable 5.12,07075.166.1 至 82.980.0
Opus 4.810260.949.1 至 66.564.2

先看兩點。第一,Opus 5.5 不是比 Opus 5 快一點:中位數快一半,加權數字快 57%,長輪次佔比也高得多。第二,同一模型內部的差異比模型之間更大:Opus 5 第 25 百分位的一輪每秒輸出 51 個令牌,第 75 百分位是 72。原因是輪次大小,值得單獨一節。

短回答總是更慢

還是 Opus 5,按一輪中的輸出令牌數切分:

一輪中的輸出令牌數輪數中位數 tok/s耗時中位數
1 至 991,85442.11.9 秒
100 至 49910,74360.63.4 秒
500 至 1,9993,51272.811.1 秒
2,000 及以上59978.438.8 秒

同一模型、同一個月、同一台機器,一行的回答和長回答速率相差一倍。模型在長輪次裡並沒有輸出得更快。每一輪在首個令牌出現前都要付一筆固定成本:請求發出,提示詞被處理,流開始。80 令牌的一輪裡,這筆成本佔耗時的三分之一;3,000 令牌的一輪裡,它淹沒在噪聲中。

對耗時與輸出令牌數做最小二乘擬合,就能分開兩者。斜率是流式傳輸速度,截距是固定成本:

模型每輪固定成本流式傳輸速度
Opus 51.03 秒81.6 tok/s
Opus 5.51.10 秒148.9 tok/s
Sonnet 50.45 秒94.9 tok/s
Fable 5.10.99 秒84.8 tok/s
Opus 4.81.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),所以沒有實測數字;本文數字均為標準速度。

DevOps 工程師撰稿人前端開發者銷售代表後端開發者教練與培訓師軟體架構師法律顧問QA 工程師財務與行政全棧開發者創意設計師移動開發者研究員安全工程師人事與招聘
專案經理翻譯Git 專家資料分析師SEO 專家會計本地化專員公關與傳播頭腦風暴者營運與物流營銷專員客戶服務專案助理採購專員社群營運私人助理

下載 AgentsRoom

在一個視窗中執行你所有專案的所有 AI 代理。

下載 AgentsRoom免費

配套應用:隨時隨地監控你的 Agent

使用 Claude、Codex、Antigravity CLI 或其他 AI 提供商。

獲取擴充功能
Chrome Web Store

把 Bug 和需求直接傳送到您的公開待辦清單。

像讀聊天記錄一樣讀代理

每個代理都有角色、頭像和一條對話執行緒,讀起來就像聊天應用。

對話檢視

AgentsRoom 對話檢視:AI 程式設計代理的工作以聊天執行緒呈現
多專案管理
多供應商
多代理執行
即時狀態
檔案差異與提交
行動應用
即時預覽
代理團隊
瀏覽器自動化
Backlog 驅動開發
提示詞庫
技能庫
檢視所有功能

繼續閱讀