我测量了Claude Code的token实际花在了哪里:96.8%用于重读历史记录,我的输入只占0.01%

dev.to 2026-07-30T23:27:59.362459

Claude Code 会将每次会话的日志写入 ~/.claude/projects/,每行都是 JSON 格式,message.usage 里记录了 API 实际返回的 Token 数。我汇总了 32 次会话的数据。这些都是实测值,不是估算。

96.8% 的 Token 都在重读对话历史。

类型 Token 数 占比
重读历史(cache_read 13.709 亿 96.8%
缓存写入 3770 万 2.7%
模型输出 670 万 0.5%
我的输入 20 万 0.01%
总计 14.155 亿 100%

我自己打字只占 0.01%。也就是说,缩短提示词只能优化账单的一万分之一。

根本原因:模型每轮对话都会把整段历史重新读一遍。 一旦某个大段返回结果进入上下文,后续每次对话你都得为它付费。假设你丢进一个 1 万字符的返回结果,然后又聊了 20 轮,那你就为这 1 万字符支付了 20 万字符的读取开销。

88.8% 的历史 Token 来自工具返回值

不是你的提示词,也不是模型生成的文字,而是工具的返回结果。问题不在于调用频率,而在于每次返回的内容有多大。

工具 占比 调用次数 每次平均字符数
抓取整个网页(浏览器) 63.3% 417 33,645
读取整个文件 13.0% 258 11,132
截图 4.0% 3 296,827
Bash 命令 3.7% 967 839
仅用 JS 提取所需值 0.4% 164 504

注意最后两行:967 次 Bash 调用的总开销还不到 3 次截图。一张截图 ≈ 354 次 Bash 调用。同样是在浏览器任务里,抓取整页平均花费 33,645 字符,而只提取你需要的几个值只需 504 字符——相差 67 倍

真正能降低 Token 消耗的三件事

  1. 不要直接读取整个文件。 每次读文件平均 11,132 字符。先用 grep 定位行号,再只读那一段。只有当第一次需要了解文件结构时,才完整读一次。

  2. 不要习惯性地截图。 每张截图 296,827 字符。如果状态能以文本形式读取,就用文本方式读。

  3. 不要抓取整个网页。 只提取你需要的几个值。33,645 → 504。

反过来:别省着用 Shell 命令。 967 次调用才占了 3.7%。


注意事项

查看原文