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 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 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 代理。

免費下載 AgentsRoom

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

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

獲取擴充功能
Chrome Web Store

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

多專案管理
多供應商
多代理執行
即時狀態
檔案差異與提交
行動應用
即時預覽
代理團隊
瀏覽器自動化
Backlog 驅動開發
提示詞庫
技能庫
檢視所有功能

繼續閱讀