跳转到内容

性能

Chord 面向长时间交互会话做了性能优化:大 transcript、模型流式输出、滚屏,以及后台 agent 活动都应保持可控。

这些数据来自特定场景,主要展示 Chord 的上下文剪裁、低开销 TUI 和内存占用在哪些地方有价值;硬件、运行环境、会话内容、模型行为和实现路径都会影响结果。

下面两张表都标注了各自的测试版本。

我们让六款 agent harness 跑了同一个 DeepSWE v1.1 任务:给 httpx 加上流式 JSON 迭代接口。Chord 用时最短、成本最低:6m37s、¥0.348,第二名的耗时是它的 1.49 倍、成本是 1.51 倍。

这个任务要按 media type 分流 application/json、application/*+json、NDJSON 和 JSON text sequence 四种解析规则,还要处理流式响应只能迭代一次、解码失败和 Content-Type 参数等细节。

Harness 耗时 成本
Chord 0.8.1 6m37s ¥0.348
deepseek-harness 0.1.5-rc.1 9m50s(1.49 倍) ¥0.527(1.51 倍)
pi 0.85.1 10m22s(1.57 倍) ¥0.576(1.65 倍)
codex 0.154.0 17m01s(2.57 倍) ¥0.929(2.67 倍)
mini-swe-agent 2.4.6 18m29s(2.79 倍) ¥0.835(2.40 倍)
claude code 2.1.272 22m25s(3.39 倍) ¥1.104(3.17 倍)

完整 token 明细:

Harness 耗时 模型调用 输入 tokens 输出 tokens 缓存读取 tokens 成本
Chord 0.8.1 6m37s 49 次 54,530 58,559 2,961,280 ¥0.348
deepseek-harness 0.1.5-rc.1 9m50s(1.49 倍) 93 次 58,569 80,314 7,357,440 ¥0.527(1.51 倍)
pi 0.85.1 10m22s(1.57 倍) 101 次 79,189 94,733 5,871,488 ¥0.576(1.65 倍)
codex 0.154.0 17m01s(2.57 倍) 121 次 72,363 135,310 15,787,264 ¥0.929(2.67 倍)
mini-swe-agent 2.4.6 18m29s(2.79 倍) 158 次 161,893 77,320 18,206,592 ¥0.835(2.40 倍)
claude code 2.1.272 22m25s(3.39 倍) 143 次 106,546 214,126 7,024,768 ¥1.104(3.17 倍)

括号里是相对 Chord 的倍数。

成本看的是 token 结构,不是总量:缓存读取比未命中缓存的输入便宜 50 倍、比输出便宜 200 倍,所以 Chord 那 296 万缓存读取 token 只花掉约 ¥0.06,真正占大头的是 58,559 个输出 token,占了 ¥0.348 的三分之二。六次运行里 Chord 的输入 token、输出 token 和模型调用次数都最少。

注:

  • 六次运行都用 deepseek-v4.1-flash。
  • 成本按该模型的标价估算,每 100 万 token:输入 ¥1、输出 ¥4、缓存读取 ¥0.02。括号里的倍数用未舍入的估算值计算,和直接用表中舍入金额相除可能略有出入。
  • 耗时排除环境准备和最终收尾时间,包含模型交互、代码修改和测试执行。

我们还测了应用交互层的内存占用:空会话,以及加载 200 条消息后。

Harness 空会话内存 200 消息内存
Chord 0.8.1 30MB 39MB
codex 0.154.0 27MB 47MB
claude code 2.1.273 143MB 216MB

注:

  • 内存数据测于 macOS 15.3.2(arm64)。
  • 不同会话和环境的内存占用会有差异,表中数据仅用于估算。
  1. 模型输出文本或思考过程时,TUI 仍保持响应。
  2. 长回复期间 CPU 受控,避免按 token 做高成本工作。
  3. 加载或浏览大历史会话时内存稳定。
  4. 后台任务活跃时,滚屏和键盘输入仍然顺滑。
  • 流式批处理:流式文本以很小的 delta 到达;Chord 会合并 provider delta,让一次 UI 更新处理多个 delta,而不是每个小片段都唤醒 TUI。
  • 渲染 cadence:流式内容按节奏刷新到屏幕,而不是每个 token 都重绘。真正的结构变化(新 block、布局边界、回滚)仍会及时刷新。
  • streaming cheap path:assistant 和 thinking block 流式输出期间,只有稳定下来的内容走完整 Markdown 渲染;正在变化的尾部走更便宜的纯文本路径。所以长段落在流式期间看起来更朴素,这是预期行为。
  • View 缓存:主 viewport、info panel、status bar 等高成本区域按帧缓存,只有输入变化时才重新渲染。
  • 滚屏批处理:鼠标滚轮和触摸板 delta 会合并后按短 cadence 应用;大 transcript 只有可见窗口保持热数据,屏幕外区域保持冷却。
  • 会话懒加载:恢复大会话时先加载当前窗口供交互,搜索 / 跳转 / 目录的 metadata 和更早的 transcript 区域在后台逐步加载。
  • 有界搜索状态:transcript 搜索只缓存当前查询在渲染结果中的命中位置,不再长期保留每一行的渲染副本。搜索可检查已 spill 的冷卡片,但不会让其正文或派生索引常驻热窗口。

性能不只在 UI 侧。Chord 还会在请求时剪裁陈旧工具输出、保留结构化摘要,并在长会话接近模型限制前做压缩。请求剪裁不改写会话历史;持久压缩会用摘要替换后续上下文,并把原文归档。这些机制用于控制请求大小和成本,实际收益取决于任务。

可配置项见上下文剪裁。

Chord 还会在模型响应完全结束前就启动安全工具,降低体感延迟。模型流式输出某个工具调用的参数时,只要参数已经完整且合法,Chord 就可能立刻开始执行该工具,不必等 provider 的「整轮结束」信号,结果一就绪就展示出来。适用对象是本地、低副作用的工具,如 read、grep、glob 和只读 shell 命令;web_fetch 这类网络请求仍等流结束再发,会改动文件的工具只在调用被确认为最终时提交(若被丢弃则回滚)。Chord 对判定安全的工具默认开启,无需配置;哪些工具能早执行、能碰什么,仍由与普通工具调用相同的权限规则约束。

  • 缩小当前会话上下文:运行 /compact,或为无关工作另开新会话。
  • 换一个终端模拟器对比:不同终端的渲染开销差异明显。
  • 超大会话里首次访问很早的 transcript 区域会比热窗口慢,再次访问会命中缓存。

如果某个交互持续偏慢,复现时采集一份 CPU profile,连同诊断包(Ctrl+G)一起附在反馈里:

Terminal window
CHORD_PPROF_PORT=6060 chord
go tool pprof http://127.0.0.1:6060/debug/pprof/profile?seconds=15