Skip to content

Latest commit

 

History

History
116 lines (84 loc) · 5.28 KB

File metadata and controls

116 lines (84 loc) · 5.28 KB

Hashline vs Builtin Edit 对比测试报告

量化对比接入 opencode-hashline 插件与不接入时(使用 OpenCode 内置 edit/write 工具)在 Token 效率、漂移检测、恢复能力和安全性方面的差异。

测试环境

项目
测试日期 2026-06-29
commit bac6ff7
Bun 1.3.14
@oh-my-pi/hashline npm dependency (vendored core removed)
测试命令 bun test tests/comparison.test.ts
测试对象 hashline 核心库 (@oh-my-pi/hashline) — 直接测试 Patch/Patcher/SnapshotStore,非 plugin adapter

说明:对比测试直接调用 hashline 核心库。在 OpenCode 中实际运行时,plugin adapter(src/tool-edit.ts)的错误处理更保守:遇到 MismatchError 直接返回 "re-read and retry",不尝试 3-way merge 恢复。T4(漂移检测)和 T8(伪造 TAG)在 adapter 中同样有效;T5(3-way merge)仅存在于核心库层面。

测试方案

对比对象

方式 说明
hashline [path#TAG] + SWAP N.=M: 行锚补丁,TAG 内容校验
builtin edit oldString → newString 精确字符串匹配(OpenCode 内置 edit 工具)
full-write 重写整个文件(write 工具)

测试场景(8 组)

# 场景 验证维度
T1 10 行文件单行编辑 小文件输入大小
T2 500 行文件单行编辑 大文件输入大小
T3 3 处非连续编辑 多 hunk 效率(调用次数 + 输入大小)
T4 文件被外部修改后编辑 漂移检测能力
T5 外部修改后的 3-way merge 恢复能力
T6 无漂移时的编辑正确性 功能等价性基线
T7 10-1000 行文件输入大小趋势 规模扩展性
T8 伪造 TAG 编辑 安全性

测试实现

  • 测试文件:tests/comparison.test.ts
  • hashline 测试通过 InMemoryFilesystem + InMemorySnapshotStore + Patcher.apply() 直接测核心层
  • builtin edit 模拟为 content.replace(oldString, newString) + 字节计数
  • full-write 模拟为整个文件内容重写 + 字节计数

测试结果

1. 输入大小随文件规模的趋势(T7)

文件行数 hashline builtin edit full-write write/hash 比值
10 46 B 28 B 141 B 3.1x
50 49 B 31 B 780 B 15.9x
100 50 B 31 B 1,580 B 31.6x
500 53 B 34 B 8,779 B 165.6x
1000 54 B 34 B 17,779 B 329.2x

结论:hashline 补丁输入恒定在 ~50 字节,不随文件大小增长。full-write 线性增长,1000 行时是 hashline 的 329 倍。builtin edit 在单行编辑时输入最小(~30B),但缺少任何安全保障。

2. 多 hunk 效率(T3)

维度 hashline builtin edit full-write
输入大小 149 B 179 B 604 B
调用次数 1 3 1

结论:3 处非连续编辑,hashline 一次调用完成;builtin edit 需要 3 次独立调用(3 倍 LLM 轮次开销)。

3. 漂移检测(T4)

场景 hashline builtin edit
文件被外部修改(目标行未变) 检测到,返回 actionable 错误 未检测到,静默应用
文件被外部修改(目标行已变) 检测到,返回 actionable 错误 仅报 "string not found"(无上下文)

结论:hashline 的 TAG 校验 100% 检测到文件漂移,错误信息包含期望 TAG、实际 TAG 和上下文行;builtin edit 在目标行未变时静默应用编辑,存在覆盖外部修改的风险。

4. 恢复能力(T5)

维度 hashline builtin edit
3-way merge 成功,本地编辑 + 外部修改均保留 无 merge 能力
外部修改感知 (通过 TAG + snapshot 历史) (盲写风险)

结论:hashline 通过 snapshot 历史 3-way merge,同时保留本地编辑和外部修改;builtin edit 无感知能力,可能覆盖外部变更。

5. 安全性(T8)

维度 hashline builtin edit
伪造 TAG 拒绝编辑 无 TAG 概念
过期 TAG 拒绝 + 恢复或提示 re-read 无校验

结论:hashline 阻止伪造/过期编辑;builtin edit 无任何版本绑定机制。

6. 正确性基线(T6)

维度 hashline builtin edit
无漂移时编辑结果 "alpha\nBETA\ngamma" "alpha\nBETA\ngamma"
结果一致

结论:无漂移场景下两种方式结果完全一致,hashline 不引入正确性回归。

总结

维度 hashline 优势 量化指标
Token 效率 大文件编辑时输入小 100-330 倍 1000 行文件:54B vs 17,779B
多 hunk 1 次调用完成 N 处编辑 3 hunk:1 call vs 3 calls
漂移检测 TAG 校验 100% 检测 builtin:0% 检测(静默应用)
恢复 3-way merge 保留所有变更 builtin:无恢复能力
安全 阻止伪造/过期编辑 builtin:无版本绑定
正确性 无漂移时与 builtin 结果一致 输出完全等价