本页每一个数字,都是 2026-10-19 在本站生产服务器上现场跑出来的。命令与原始输出一并给出——照抄第 6 节的命令,你能得到相近的结果(为什么是「相近」,见第 7 节)。
一句话:这是一份可复现的实测记录,不是评测文章。没有「我在高铁上试了一下」这类无法验证的叙事,只有命令、输出和判断依据。
三条规矩:只写命令跑出来的数字;拿不到的写「未测」并说明原因;页面文案与实测冲突时,以实测为准——第 4 节就是一处冲突的更正,我们没有把它藏起来。
数据源:/var/lib/toolbox/uptime-latest.json(巡检程序每 5 分钟覆盖的一次快照)与现场 curl。采集环境:Ubuntu 生产服务器(47.114.58.205)上的 loopback 到公网域名;体积复核在第二个源 IP 上用 curl 8.9.1 完成。
巡检程序 /opt/toolbox/bin/uptime -dir /var/lib/toolbox -timeout 6s 由 toolbox-uptime.timer 每 5 分钟触发一次,对 34 个子域的 / 各发一次 HTTPS 请求,记录往返毫秒。下表按耗时升序排列。
快照 checked_at = 2026-10-19T06:41:16+08:00 · 采集到 34 条 · 在线 34/34 · 最快 60 ms(Markdown 预览)· 最慢 87 ms(Cron 解析)· 中位 74 ms · 均值 74.26 ms · 合计 2,525 ms
| # | 工具 | 域名 | 状态 | 耗时(ms) |
|---|---|---|---|---|
| 1. | Markdown 预览最快 | md.yomzoo.com | 200 | 60 |
| 2. | 时间戳转换 | ts.yomzoo.com | 200 | 64 |
| 3. | HTTP 安全头 | headers.yomzoo.com | 200 | 65 |
| 4. | 进制转换 | base.yomzoo.com | 200 | 65 |
| 5. | 颜色对比度 | color.yomzoo.com | 200 | 67 |
| 6. | 表格转换 | table.yomzoo.com | 200 | 67 |
| 7. | JSON → YAML | yaml.yomzoo.com | 200 | 67 |
| 8. | 更新日志生成 | changelog.yomzoo.com | 200 | 67 |
| 9. | 密码生成 | pass.yomzoo.com | 200 | 68 |
| 10. | 文本统计 | text.yomzoo.com | 200 | 68 |
| 11. | JSON 路径 | jsonpath.yomzoo.com | 200 | 68 |
| 12. | 子网掩码计算 | subnet.yomzoo.com | 200 | 68 |
| 13. | 正则测试 | regex.yomzoo.com | 200 | 71 |
| 14. | JSON ↔ CSV | csv.yomzoo.com | 200 | 72 |
| 15. | 时区转换 | tz.yomzoo.com | 200 | 72 |
| 16. | JSON 格式化 | json.yomzoo.com | 200 | 72 |
| 17. | 单位换算 | unit.yomzoo.com | 200 | 74 |
| 18. | JWT 验签 | jwt.yomzoo.com | 200 | 74 |
| 19. | UUID / ULID | id.yomzoo.com | 200 | 75 |
| 20. | AI 爬虫防护 | bot.yomzoo.com | 200 | 77 |
| 21. | 图片转换 | image.yomzoo.com | 200 | 77 |
| 22. | 文本对比 | diff.yomzoo.com | 200 | 77 |
| 23. | UA 解析 | ua.yomzoo.com | 200 | 77 |
| 24. | 哈希计算 | hash.yomzoo.com | 200 | 78 |
| 25. | 无障碍合规检测 | a11y.yomzoo.com | 200 | 81 |
| 26. | SSL 证书检查 | ssl.yomzoo.com | 200 | 83 |
| 27. | URL 解析 | url.yomzoo.com | 200 | 83 |
| 28. | JSON → 代码 | codegen.yomzoo.com | 200 | 83 |
| 29. | Cron 反查 | cronfind.yomzoo.com | 200 | 83 |
| 30. | 编解码 | codec.yomzoo.com | 200 | 83 |
| 31. | 颜色与色阶 | palette.yomzoo.com | 200 | 84 |
| 32. | 图片 Data URI | datauri.yomzoo.com | 200 | 84 |
| 33. | 文本行处理 | lines.yomzoo.com | 200 | 84 |
| 34. | Cron 解析最慢 | cron.yomzoo.com | 200 | 87 |
同一批工具、同一台服务器,相隔 5–15 分钟的三轮巡检,数字差得很多。这不是测错,是单次探测的固有噪声——所以我们把每轮都当快照记录,不做「谁比谁快」的排名。
| 快照 checked_at | 最快 | 中位 | 均值 | 最慢 |
|---|---|---|---|---|
2026-10-19T06:26:19+08:00 | 83 ms | 151 ms | 144.62 ms | 188 ms |
2026-10-19T06:36:19+08:00 | 51 ms | 99 ms | 91.71 ms | 107 ms |
2026-10-19T06:41:16+08:00本页快照 | 60 ms | 74 ms | 74.26 ms | 87 ms |
体积是响应体字节数(curl 的 %{size_download},请求未带 Accept-Encoding,即未压缩 HTML)。同时给一列 gzip 传输字节,因为浏览器实际收到的是压缩后的。
| 路径 | HTML 体积 | gzip 传输 | 响应耗时(3 次中位) | 文件 mtime |
|---|---|---|---|---|
/ | 133,289 | 26,775 | 0.041 s | 2026-10-19 06:39:32 |
/tools.html | 284,498 | 41,073 | 0.320 s | 2026-10-19 06:35:39 |
/news.html | 36,480 | 7,822 | 0.034 s | 2026-10-19 06:39:38 |
/directory/ | 1,750,038 | 124,719 | 2.676 s | 2026-10-19 06:35:38 |
/directory/ 是四个页面里唯一超过 1 MB 的:1,750,038 B(1.67 MiB),gzip 后仍有 124,719 B,是体积上的主要异常点。/tools.html 三次耗时分别是 0.041 / 0.320 / 0.515 s,呈双峰,表中取中位数 0.320 s——如实列出分布,避免只给一个好看的数字。
首页与资讯页由部署/定时脚本重建(上表 mtime 就是构建时刻);你复跑时若数字已变,多半是又重建过——这是体积随时间变化的正常现象,不是测错。
/tools/<slug>/ 不是磁盘上的文件:nginx 用 proxy_pass http://127.0.0.1:8791/ 把它反代给 toolbox,并按 Host 头选工具。所以这里测的是该 URL 的真实响应体。
合计 204,179 B · 平均 6,005 B · 最大 时区转换(9,602 B) · 最小 无障碍合规检测(4,682 B) · 前 5 大:时区转换 9,602 B · 子网掩码计算 9,582 B · 更新日志生成 8,801 B · 颜色与色阶 8,691 B · AI 爬虫防护 6,925 B
| 工具 | 路径 | HTML 体积 | gzip 传输 |
|---|---|---|---|
| 时区转换前 5 大 | /tools/tz/ | 9,602 | 3,207 |
| 子网掩码计算前 5 大 | /tools/subnet/ | 9,582 | 3,580 |
| 更新日志生成前 5 大 | /tools/changelog/ | 8,801 | 3,399 |
| 颜色与色阶前 5 大 | /tools/palette/ | 8,691 | 2,797 |
| AI 爬虫防护前 5 大 | /tools/bot/ | 6,925 | 2,786 |
| 文本行处理 | /tools/lines/ | 6,527 | 2,579 |
| 单位换算 | /tools/unit/ | 6,520 | 2,503 |
| JSON 格式化 | /tools/json/ | 6,060 | 2,538 |
| 图片转换 | /tools/image/ | 6,043 | 2,444 |
| 文本对比 | /tools/diff/ | 6,039 | 2,448 |
| 密码生成 | /tools/pass/ | 5,962 | 2,419 |
| 文本统计 | /tools/text/ | 5,916 | 2,481 |
| 表格转换 | /tools/table/ | 5,728 | 2,374 |
| UA 解析 | /tools/ua/ | 5,725 | 2,531 |
| JSON 路径 | /tools/jsonpath/ | 5,696 | 2,485 |
| JSON → YAML | /tools/yaml/ | 5,692 | 2,537 |
| 编解码 | /tools/codec/ | 5,648 | 2,385 |
| 哈希计算 | /tools/hash/ | 5,646 | 2,449 |
| UUID / ULID | /tools/id/ | 5,513 | 2,357 |
| JSON ↔ CSV | /tools/csv/ | 5,506 | 2,396 |
| 正则测试 | /tools/regex/ | 5,502 | 2,408 |
| JSON → 代码 | /tools/codegen/ | 5,476 | 2,424 |
| 进制转换 | /tools/base/ | 5,342 | 2,303 |
| JWT 验签 | /tools/jwt/ | 5,256 | 2,378 |
| 颜色对比度 | /tools/color/ | 5,249 | 2,286 |
| 图片 Data URI | /tools/datauri/ | 5,165 | 2,323 |
| Markdown 预览 | /tools/md/ | 5,157 | 2,317 |
| HTTP 安全头 | /tools/headers/ | 5,136 | 2,321 |
| Cron 反查 | /tools/cronfind/ | 5,125 | 2,313 |
| URL 解析 | /tools/url/ | 5,113 | 2,306 |
| Cron 解析 | /tools/cron/ | 5,093 | 2,263 |
| 时间戳转换 | /tools/ts/ | 5,039 | 2,221 |
| SSL 证书检查 | /tools/ssl/ | 5,022 | 2,225 |
| 无障碍合规检测最小 | /tools/a11y/ | 4,682 | 1,887 |
tz、palette、ua 这三页会把结果区换成限流提示,页面随之变小(实测 tz 从 9,602 B 掉到 6,585 B)。上表取的是未限流时的完整页面,并在第二个源 IP 上复核一致(tz 9,602 / palette 8,691 / ua 5,725 B,三次一致)。站内此前的文案写过「全部本地计算、不联网」。我们按可复跑的方式核对,结论和文案不一致,因此如实更正。
| 检查项 | 结果 | 怎么测的 |
|---|---|---|
| JS 发起的网络请求 fetch / XMLHttpRequest / sendBeacon | 34 页全部为 0 | grep -cE 'fetch\(|XMLHttpRequest|navigator.sendBeacon' |
外链脚本 <script src=> | 34 页全部为 0 | grep -c '<script src=' |
| 计算型内联 JS | 没有:32 页只有一个 341 B 的「填入示例」脚本;changelog 892 B(多一个复制按钮);a11y 0 B | 逐块提取 <script> 并统计,搜索 crypto.subtle / TextEncoder / btoa / JSON.parse 等关键词均无命中 |
| 原生表单 | 34 / 34 都有(method="post" 或 method="get") | grep -o '<form[^>]*>' |
| Set-Cookie | 0(抽查 json / hash / text / codec) | curl -D - 看响应头 |
| localStorage / sessionStorage | 0 处(同上 4 页) | grep -cE 'localStorage|sessionStorage' |
如果计算真在浏览器里,那么用 curl 直接 POST(curl 不执行任何 JavaScript)应该拿不到结果。实测拿到了:
# 请求体只有 17 字节 $ curl -s -X POST --data-urlencode "input=abc" --data-urlencode "alg=all" \ https://www.yomzoo.com/tools/hash/ # 返回的 HTML 里(HTTP 200,8,737 B,0.053713 s): MD5 900150983cd24fb0d6963f7d28e17f72 SHA-256 ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
这两个值与标准测试向量一致。curl 不会跑页面里的脚本,所以它们只可能是服务端算出来的。
grep 为 0 只证明「页面没有用 JS 发请求」,不证明「没有上传」。这 34 个工具的真实工作方式是:浏览器把输入以原生表单 POST 到本站服务器,由服务端计算后把结果渲染回 HTML。
因此「零上传」不成立,「断网也能用」更不成立——断网时表单提交不出去,工具不能工作。我们不写这种无法复现的话。
能确认的隐私事实是另外几条:不加载任何第三方脚本(34/34 外链脚本为 0)、不设 Cookie(抽查 0)、不用 localStorage/sessionStorage(抽查 0 处),输入只经 HTTPS 提交到本站服务器。「输入是否落盘、日志是否记录内容」无法从外部验证,列入第 7 节未测项。
不是「一律服务端」:/directory/(收录目录)的筛选就是纯前端——实测该页 fetch/XHR 计数为 0,内联脚本里有 addEventListener("input") 与对 .ai-dir-item 的 querySelectorAll 过滤,输入只用来隐藏/显示已随页面下发的条目。
区别在于数据量级与计算位置:目录筛选是在已下载的 DOM 上做过滤,而 34 个工具的计算由服务端完成。我们这次没有找到可与之对照的「纯前端工具」——34 个页面里没有任何一段计算型 JS(4.1 第 3 行)。
用站内真实文件当输入,POST 到两个工具,记录提交量、服务端耗时与结果是否完整。完整性判据不用「看着像」,而是拿工具自己输出的「字符数 / 字节数」与 wc 独立比对。
| 用例 | 输入 | 提交字节 | 响应字节 | 耗时 | 完整性 |
|---|---|---|---|---|---|
文本统计/tools/text/ | sitemap.xml 64,398 B / 2,205 行 | 91,543 | 92,887 | 0.082 s | 字符数 64,398 = wc -c ✓ |
文本统计/tools/text/ | sitemap × 8 515,184 B / 17,640 行 | 732,239 | 698,113 | 1.372 s | 字符数 515,184 = 8 × 64,398 ✓ |
JSON 格式化/tools/json/ | 367 个 URL 的 JSON 18,811 B | 26,113 | 49,989 | 0.051 s | 字节数 in 18,811 = out 18,811 ✓ |
application/x-www-form-urlencoded,XML/JSON 里的 < > " / 和换行被百分号编码,体积会涨;耗时含回显,服务端把输入原样写回 textarea,所以响应字节也大。这三条都是「含传输的端到端耗时」,不是纯计算耗时。未测:超过 515 KB 的输入、并发与压测、非法/畸形输入的报错路径。原因见第 7 节。
下面的命令就是本页实际用的。在你自己的机器上跑,数字会因网络位置、时间点而不同——重点是量级与结论应当一致。注意 B 段不要连跑太多遍,会踩到第 3.2 节那个每小时 30 次的限流。
# A. 巡检快照(每 5 分钟被覆盖一次)
cat /var/lib/toolbox/uptime-latest.json
curl -s 'http://127.0.0.1:8791/status?format=json'
# 按耗时排序并汇总
python3 - <<'PY'
import json
d = json.load(open('/var/lib/toolbox/uptime-latest.json'))
rs = sorted(d['results'], key=lambda x: x['ms'])
ms = [r['ms'] for r in rs]
print(d['checked_at'], 'up', d['up'], 'total', d['total'], 'n', len(rs))
print('min', min(ms), 'max', max(ms),
'avg', round(sum(ms) / len(ms), 2),
'median', sorted(ms)[len(ms) // 2])
for r in rs:
print(r['ms'], r['name'], r['domain'], r['status'])
PY
# B. 34 个工具路径页体积(第二列是 gzip 传输字节)
for s in a11y ssl pass bot headers color palette hash url image datauri text md \
csv base unit diff codegen cronfind table yaml lines cron jwt ts tz id \
json jsonpath regex codec ua changelog subnet; do
raw=$(curl -s -o /dev/null -w '%{size_download}' "https://www.yomzoo.com/tools/$s/")
gz=$(curl -s -H 'Accept-Encoding: gzip' -o /dev/null \
-w '%{size_download}' "https://www.yomzoo.com/tools/$s/")
echo "$s $raw $gz"
done
# C. 「零上传」核查
# 1) 页面里有没有 JS 发起的请求
for s in json hash text codec; do
printf '%s ' "$s"
curl -s "https://www.yomzoo.com/tools/$s/" \
| grep -cE 'fetch\(|XMLHttpRequest|navigator.sendBeacon'
done
# 2) 有没有外链脚本、有没有原生表单
curl -s https://www.yomzoo.com/tools/json/ | grep -c '<script src='
curl -s https://www.yomzoo.com/tools/json/ | grep -o '<form[^>]*>'
# 3) 关键反证:curl 不执行 JS,POST 后仍返回正确哈希
curl -s -X POST --data-urlencode "input=abc" --data-urlencode "alg=all" \
https://www.yomzoo.com/tools/hash/ \
| grep -o '900150983cd24fb0d6963f7d28e17f72'
# D. 大输入:把站内真实文件当输入
wc -c /www/wwwroot/ai.yomzoo.com/sitemap.xml
curl -s -X POST \
--data-urlencode "text@/www/wwwroot/ai.yomzoo.com/sitemap.xml" \
--data-urlencode "style=all" -o /tmp/out.html \
-w 'upload=%{size_upload} download=%{size_download} total=%{time_total}\n' \
https://www.yomzoo.com/tools/text/
# 结果里应出现 字符数 64398 与 字节数 64398
grep -oE '<b>[0-9]+</b><span>(字符数|字节数)' /tmp/out.html
# E. 关键页面体积与耗时(建议跑 3 次取中位数)
for p in / /tools.html /news.html /directory/; do
for i in 1 2 3; do
curl -s -o /dev/null \
-w "$p %{size_download}B %{time_total}s\n" \
"https://www.yomzoo.com$p"
done
curl -s -H 'Accept-Encoding: gzip' -o /dev/null \
-w "$p gzip %{size_download}B\n" "https://www.yomzoo.com$p"
done
render_homepage_*.py),体积会随内容变化。本页记录的是那一刻,不是永久值。tz、palette、ua 这类 GET 即算的工具时,结果区会被限流提示替换(tz 9,602 → 6,585 B)。本页取未限流值,并用第二个源 IP 复核。hash 的两个标准向量,其余未逐个验证;image / datauri 这类文件上传工具的实际传输表现——只测了页面体积。