开发者 Nathan Sutton 近日在一台配有 24GB 统一内存的 M4 MacBook Pro 上,对 9 款主流代码 Agent 框架(Coding Harness)展开了一场严苛的本地实测。测试统一基于 llama.cpp(build 10470) 驱动 3-bit 量化的 Qwen 3.8 27B,在 8 个基准编程任务中横向比对真实开销。结果暴露出一个令端侧开发者沮丧的鸿沟:同一套开源模型,首个 Token 的等待时间在极简工具中只需 12.2 秒,而在复杂框架下却飙升至 225.7 秒

这场测试击碎了行业长期存在的直觉认知:拖垮本地代码 Agent 体验的,往往不是端侧小模型的代码理解力,而是 Harness 框架直接照搬云端设计范式所带来的架构傲慢。在数据中心万级速率的预填充掩护下被视作“免费”的提示词工程,搬到本地笔记本上,立刻退化成足以逼疯开发者的死机模拟器。

万级 Schema 撞上端侧物理墙:首字 225 秒的 Prefill 灾难

在云端数据中心,高端 GPU 的预填充(Prefill)速度普遍超过 10,000 tokens/s。开发者在系统提示词中塞入几万字的代码规范,或者挂载数十个复杂的工具接口定义(Tool Schema),模型仅需 0.2 到 1.8 秒就能消化完毕。这种硬件宽裕催生了云端框架的挥霍习惯。

然而,端侧芯片的读写速度完全遵循另一套物理定律。在这台 M4 笔记本上,模型读取提示词的 Prefill 速度约为 90 tokens/s,而实际生成代码的 Decode 速度只有约 10 tokens/s。这意味着每增加 1,000 个 Token 的前置内容,开发者就得多盯着光标发呆 11 秒。

架构落差:1.8 万 Token 提示词在云端与端侧的物理鸿沟 云端数据中心 GPU 范式 吞吐能力:Prefill 速率 > 10,000 tokens/s 首轮开销:消化 18,046 tokens 1.8 秒 复杂 Schema 几乎无体感等待 上下文总容量:200K+ 动态充裕 本地端侧(M4 24GB)实测 吞吐能力:Prefill 速率 ~ 90 tokens/s 首轮开销:消化 18,046 tokens 225.7 秒 光标卡顿近 4 分钟,高频触发超时 32K 窗口中仅剩 44% 留给真实业务代码

实测数据直观展现了这种设计惯性造成的灾难:OpenCode 首轮带入的系统提示与 10 个工具 Schema 膨胀至 18,046 tokens,导致首 Token 延迟直接拉长到 225.7 秒(近 4 分钟);同属重型设计的 Crush 携带 26 个工具定义,首 Token 延迟也高达 199.8 秒

相比之下,轻量设计的 pi 将前置提示词精简至 2,008 tokens,首字延迟缩短为 21.6 秒mini-swe-agent 仅带 1 个工具接口,延迟更是压低至 12.2 秒

更致命的影响在于内存上下文的挤占。受限于统一内存规格,本地部署通常只能维持约 32,000 tokens 的上下文窗口。OpenCode 尚未开始写下一行代码,就已经把 56% 的显存预算消耗在自己的静态声明上,留给实际编程项目的有效空间只剩 44%。

零并发容忍度:后台静默请求冲垮单 GPU

云端 Harness 的第二个不良习惯,是肆无忌惮的后台辅助请求(Side Requests)。在远程调用商业 API 时,客户端会静默发起诸如“自动生成当前会话标题”、“总结上一轮修改历史”等伴随调用,依靠服务器集群的多卡吞吐,主业务与后台任务可以并行不悖。

但本地笔记本既是客户端,又是唯一的推理服务器。当单颗 M4 芯片正全力计算多步 Agent 循环时,后台请求会直接抢占计算管线。

测试显示,在执行 24 次测试任务期间,Crush 发起了多达 51 次后台请求,OpenCode 发起了 33 次。这些请求几乎完全与 Agent 的核心决策轮次重叠,使得本地 GPU 的时间占空率分别达到 114%125%。这意味着两项推理请求强行挤在单 GPU 上排队碰撞,导致本来就有限的带宽被反复打断,引发密集的重复 Prefill。

  • 风险.如果本地框架不具备严格的“单线程请求串行化”与会话抑制机制,任何静默的辅助 Agent 行为都会导致前台敲代码体验全面冻结。

在多轮交互中,端侧系统得以维持运转的唯一护城河是前缀缓存复用(Prompt Caching)。相关基准测试表明,在 Apple Silicon 架构下,一段 11.6K tokens 的提示词在冷启动时需耗费 131 秒完成预填充,而一旦命中缓存,后续轮次的延迟骤降至 0.38 秒。实测中,保持字节级缓存稳定的框架(如 goose 1.50.0 修复时间戳污染后达到 100% 复用),后续轮次的等待时间能稳定收敛至 1 到 2 秒内。

云端 Harness 的富人毛病,在端侧受限硬件上全部成了要命的系统负债。

极简路线与通用工程的现实取舍

面对云端架构的臃肿,原文作者打造的轻量 Harness Chad 走向了另一个极端:全框架仅保留 basheditwrite5 个核心工具,直接使用模型在预训练期就已经学过的接口范式。

配合更紧密契合 Apple 统一内存的 MLX 进程内推理引擎DFlash2 投机推测解码,Chad 将首字等待压到了 4.6 秒,生成速率提升至 17.4 tokens/s,并在 24 次任务中取得 100% 的通过率。

但这并不意味着大型框架一无是处。必须指出的是,该测试选用的基准是复杂度较低的 Exercism 算法题。在此类线性短任务中,极简工具自然占尽轻快优势;但反对者同样指出,像 ClineCrush 搭载的 26 个工具链,涵盖了工程自省、模糊检索以及跨目录复杂修改能力。外部工程实践显示,在处理大型项目迁移或底层系统开发时,缺失高级工具链的极简 Agent 往往缺乏全局把控力。

对于尝试在本地部署代码助手的开发者,目前更现实的选型策略已经十分清晰:

  • 建议.在 24GB 至 64GB 的 Apple Silicon 设备上,应优先选用 Schema 经过裁剪、具备强制前缀缓存复用能力的 Local-first 框架;在部署 Qwen 3.8 27B 等主力模型时,切忌盲目套用 temp=0.2 或关闭思考机制(thinking off),必须维持官方推荐的 temperature=1.0top_p=0.95,避免端侧推理陷入死循环。

本地代码 Agent 正在经历去云端化的阵痛。当算力从无限伸缩的云端机房退缩到一张发烫的笔记本主板上,代码框架必须学会放下大包大揽的排场,以更节制的工程纪律面对每一微秒的硬件开销。