性能

zn-gate 的耗时:智能体钩子和本地扫描器,并标明每次测量的版本、日期、机器和方法。

查看 .md

zn-gate 运行在你的机器上,所以它的代价是每次工具调用多出的一点时间,而不是一次网络往返。本页给出实测数字,说明每个数字对应的版本和日期,以及它们不涵盖什么。这些数字是在一台机器上的测量结果,并不承诺你的机器上也有同样的速度。

智能体钩子

编码智能体每次调用工具时,都会启动 zn-gate 钩子并等待它:调用前一次(例如一条 shell 命令),调用后一次(带上工具的输出)。

2026-10-17 在 GitHub Actions 的 ubuntu-latest 运行器(4 vCPU AMD EPYC 7763)上测得,Node.js 22.23,使用当天 zn-gate 仓库的钩子代码(包版本 1.11.0)。单位为毫秒。同一台机器上,空的 node -e "" 耗时 25 毫秒(p50)。

智能体 事件 p50(毫秒) p95(毫秒)
Claude Code PreToolUse,shell 命令 51 54.7
Codex CLI PreToolUse,shell 命令 52 53.8
Cursor beforeShellExecution 51.7 58.6
Claude Code PostToolUse,1 KB 63 65
Codex CLI PostToolUse,1 KB 62.2 65.3
Cursor postToolUse(MCP),1 KB 62.2 64
Claude Code PostToolUse,100 KB 67.5 70.4
Codex CLI PostToolUse,100 KB 67 68.8
Cursor postToolUse(MCP),100 KB 66.9 68.9
Claude Code PostToolUse,100 KB,含 2 个密钥 73.8 76.3
Codex CLI PostToolUse,100 KB,含 2 个密钥 74.7 77.5
Cursor postToolUse(MCP),100 KB,含 2 个密钥 75.9 77.9
Claude Code PostToolUse,1000 KB 85.8 89.4
Codex CLI PostToolUse,1000 KB 86.4 88.5
Cursor postToolUse(MCP),1000 KB 88.9 92.3

这段时间大部分是 Node.js 的启动时间。读表方法:一条 shell 命令在执行前约耗时 50 毫秒,最大 1000 KB 的工具结果最多约 90 毫秒(p95)。Cursor 只允许 zn-gate 改写 MCP 输出,所以它调用后的行针对的是 MCP 工具。OpenCode 不在表中:它的 zn-gate 插件运行在 OpenCode 进程内,不会启动钩子进程。

钩子是如何测量的

  • 基准测试像智能体一样,用 stdin 传入智能体的事件来启动 node lib/hooks/runner.js <agent>,并计时直到进程退出。
  • 输出为 1 KB、100 KB(也包含带两个密钥的情形)和 1000 KB 类似源代码的文本。
  • 保险库处于锁定状态,因此检测到的值会被永久遮蔽,也不涉及任何后台进程。
  • 每种情形在一次预热运行之后运行 40 次。p95 取 40 个耗时中的第 38 个(最近秩法)。
  • 每次运行都会生成虚构的值。如果其中任何一个从钩子返回,或钩子无法检查输出,或含密钥的情形里没有用 zn-gate 标记替换它们,该情形即失败。

CI 检查会在钩子代码每次变更时运行该基准测试。它比较每种情形的 p95 除以同一次运行中 Node 启动时间的比值,因此机器快慢对结果影响不大;若该比值比保存的基线高出 20 % 以上,检查就会失败。

本地扫描器

扫描器是 zn-gate 中用规则检查文本并遮蔽密钥的部分,在进程内运行,不使用网络。共有两次测量,在不同时间于一台搭载 Intel Xeon Platinum 8259CL 的 AWS 机器上进行。两次都使用扫描器此前没有见过的良性输入(无缓存)。

检查工具结果(规则加密钥遮蔽)

2026-10-11 使用 zn-gate 1.4.1 测得,机器为 2 vCPU 的 AWS 实例,Node.js 24。这是完整的 check_tool_result 调用,在进程内执行。p50 为 3 次运行的中位数,p99 为 3 次中最差的一次。

输入大小 p50(毫秒) p99(毫秒)
200 B 0.045 0.19
4 KB 0.30 0.81
64 KB 3.8 6.7

仅规则

2026-10-10 使用 zn-gate 1.4.0(规则版本 2026-09-29.1)测得,机器为 2.5 GHz,Node.js 24.21,每种大小 20,000 个样本。这是不含密钥遮蔽的规则检查。

输入大小 p50(毫秒) p95(毫秒)
200 个字符 0.013 0.028
1,000 个字符 0.047 0.077
4,000 个字符 0.173 0.372
16,000 个字符 0.681 1.179

对于最多约 1,000 个字符的输入,规则耗时低于 0.1 毫秒(p50)。耗时与输入长度成正比,因此不要把这个数字套用到长得多的文本上。

局限

  • 钩子的数字来自单个 CI 运行器。在你的电脑上耗时会不同;差异大部分来自 Node.js 启动,而不是 zn-gate。
  • 扫描器的数字是用 zn-gate 1.4.0 和 1.4.1 测得的,以后的版本没有重新测量,本页也不把它们当作新版本的结果。
  • 扫描器的数字针对扫描器此前没见过的文本;它们是进程内耗时,不包括启动 Node.js 或智能体的时间。
  • 本页不涵盖可选的云端检查,它会增加一次网络调用,不在本地数字之内。这里不公布它的端到端延迟。
  • 这些数字是在各自一台机器上少量运行的中位数和高百分位,不是保证。

基准测试脚本和测量文件位于 zn-gate 仓库的 bench 文件夹。相关页面:密钥遮蔽和配置。