性能
zn-gate 的耗时:智能体钩子和本地扫描器,并标明每次测量的版本、日期、机器和方法。
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 文件夹。相关页面:密钥遮蔽和配置。