直接答案:36 个文章页的 4.22 MB 原始 HTML,用 gzip -9 重压缩后是 663 KB(15.7%),brotli -q11 后是 493 KB(11.7%)。线上对同一批 10 个站点各取 1 条文章 URL 实测:10/10 返回 gzip,0/10 使用 brotli;wire/decoded 中位 26.9%(14.4%–45.8%)。
所以第 89 期的 4.22 MB 是文档字节,不是传输字节。但“已经 gzip”也不等于“已经用上更好的压缩”:本期线上探测里没有一个站点返回 brotli。
方法:本地重压缩 + 线上编码探测
本地:读取第 83 期缓存的 36 个文章页原始 HTML(与第 89 期同一批),分别用 gzip.compress(data, 9) 与 brotli.compress(data, quality=11) 压缩,比较原始、gzip、brotli 字节。这是实验室上限,不是服务器默认档。
线上:对同一批 36 页所属的 10 个站点,各取该站第一条 status=200 的文章 URL,发一次 GET,请求头带 Accept-Encoding: gzip, br,记录 HTTP 状态、Content-Encoding、Content-Type、实际收到的字节(wire)、解码后的字节(decoded)与错误;站点间隔 1.5 秒,超时 25 秒。
| 项 | 本地重压缩 | 线上实测 |
|---|---|---|
| 样本 | 36 页缓存 HTML | 10 站各 1 条 URL |
| 比较对象 | raw / gzip / brotli 字节 | wire / decoded 字节 |
| 压缩档 | gzip 9、brotli quality 11 | 服务器实际选择 |
| 能否代表站点 | 不能,只代表这批 HTML 的可压缩性 | 不能,单条 URL 只是探测点 |
结果:gzip 15.7%,brotli 11.7%
| 口径 | 原始 | 压缩后 | 占原始 | 节省 |
|---|---|---|---|---|
| gzip -9 | 4,220,772 | 663,075 | 15.7% | 84.3% |
| brotli -q11 | 4,220,772 | 493,187 | 11.7% | 88.3% |
| brotli 相对 gzip | 663,075 | 493,187 | 74.4% | 25.6% |
按页看,gzip 占比中位 15.9%(10.0%–34.9%),brotli 中位 11.3%(7.1%–27.4%)。压缩率最高的是 SVG/模板占比大的页面,最低的是文字占比高、重复结构少的页面。
| 压缩后占原始 | gzip 页数 | brotli 页数 |
|---|---|---|
| 低于 12%(brotli 低于 9%) | 6 | 11 |
| 12%–16%(brotli 9%–12%) | 12 | 8 |
| 16%–20%(brotli 12%–16%) | 10 | 9 |
| 20% 以上(brotli 16% 以上) | 8 | 8 |
线上:10 个站点全部 gzip,没有一个 brotli
| 站点 | 状态 | Content-Encoding | wire 字节 | decoded 字节 | wire/decoded |
|---|---|---|---|---|---|
| E03 | 200 | gzip | 14,859 | 55,494 | 26.8% |
| E06 | 200 | gzip | 10,890 | 37,682 | 28.9% |
| E09 | 200 | gzip | 16,639 | 85,423 | 19.5% |
| E14 | 200 | gzip | 13,673 | 72,143 | 19.0% |
| E16 | 200 | gzip | 8,716 | 19,026 | 45.8% |
| E19 | 200 | gzip | 5,034 | 22,160 | 22.7% |
| E22 | 200 | gzip | 22,530 | 156,701 | 14.4% |
| E23 | 200 | gzip | 83,342 | 308,340 | 27.0% |
| E26 | 200 | gzip | 11,816 | 37,100 | 31.8% |
| E28 | 200 | gzip | 8,573 | 26,928 | 31.8% |
线上页面与 2026-11-03 缓存可能不同(例如 E03 的 decoded 只有 55,494 字节,而缓存 raw 是 155,211 字节),因此本表只在同一响应内比较 wire 与 decoded,不与本地 raw 直接相减。
10 条 URL 的 wire 合计 196,072 字节,decoded 合计 820,997 字节,整体 23.9%。但这是当前线上内容,不是缓存那 4.22 MB;两组数字不能混算。
SVG 越多,压缩率越高
把第 89 期的内联 SVG 占比与本期的 gzip 占比按同一页配对,36 页的 Pearson 相关系数为 -0.568:SVG/模板占比越高,gzip 后占原始的比例越低。这是关联,不是因果;它符合“重复结构更容易压缩”的直觉,但不能据此说 SVG 没有成本——它仍然增加解析、内存与首字节前的传输量。
为什么本地 15.7% 与线上中位 26.9% 不同
两组数字不可直接比较:本地是对缓存文档做 gzip -9 / brotli -q11;线上是服务器对当前页面选择压缩档,且页面内容、大小与 11 月 3 日缓存不同。线上中位更高,可能来自更低的 gzip 档、不同的内容或动态页面,但本期没有逐个核对服务器配置,不能归因。
对验收的启示
- 分开记“文档大小”和“传输大小”。 4.22 MB 的 HTML 经 gzip 后约 663 KB;只报原始体积会高估传输压力。
- 检查 Content-Encoding,不只看页面大小。 10 个站点都返回 gzip,但没有一个用 brotli;是否启用是服务器/CDN 决策。
- 把 brotli 当作可询价的选项。 在本样本里,brotli 比 gzip 再小 25.6%;实际收益取决于内容与服务器档位。
- 单条 URL 不是全站结论。 同一站点不同路径、不同类型、不同边缘节点可能不同;验收应覆盖首页、文章页与关键着陆页。
- 压缩率不是性能评分。 本期不测 TTFB、LCP、解析或 CrUX;压缩只是传输体积的一个代理。
局限
- 本地是实验室上限:gzip 9 / brotli 11 不是服务器默认档,结果只说明可压缩性。
- 线上只有 10 条 URL:每站 1 条,不能代表站点全量或所有路径。
- 内容可能已变:线上 decoded 与 2026-11-03 缓存不同,不能与本地 raw 相减。
- 只测 HTML:不含图片、CSS、JS、字体与 HTTP 头。
- 单时间窗:2026-11-06 20:42 一次;未跨天复测。
- pilot:10 站 36 页,不外推行业。
数据与复算
本地压缩:equipment-article-html-compression-2026.csv(36 行 × 9 列:原始/gzip/brotli 字节与占比、节省比例)。线上编码:equipment-live-content-encoding-2026.csv(10 行 × 10 列:状态、Content-Encoding、Content-Type、wire/decoded 字节与占比、错误、时间)。仓库内为 docs/research/2026-11-article-html-compression.csv 与 2026-11-live-content-encoding.csv。
探测:scripts/article_html_compression_probe.py(local / live 两个子命令);单元测试 scripts/test_article_html_compression_probe.py(无网络,7 项,覆盖 gzip/brotli 压缩、解码、百分比与未知编码)。运行:
python -m unittest scripts.test_article_html_compression_probe
配套:文章页 HTML 体积组成 pilot、文章页图片交付 pilot、首页静态资源清单。
数据来源与口径
- 缓存页面:第 83 期 10 站 36 页(2026-11-03 08:40–08:41)。
- 本地压缩:2026-11-06,gzip -9 与 brotli quality 11,UTF-8 原始字节。
- 线上探测:2026-11-06 20:42,10 站各 1 条 URL,Accept-Encoding: gzip, br。
- 状态与编码按实际返回记录;不对未返回的编码做推断。