7-Zip 是 Windows 上最常见的压缩工具,26.05 版安装器 1663506 字节。它把压缩、解压、加密、分卷做在一个界面里,命令行版本可以和脚本接起来。

它解决的问题是「压缩级别到底该选几」。默认档压完就完事,但换一档要多久、能省多少,从来没人给过数字,只能凭感觉调。

这次拿 291997198 字节、6104 个文件的真实目录,把五档压缩级别各跑一遍,量耗时和产物大小,再看界面里那两列体积怎么读。

安装器解出七个可执行文件

7z2605-x64.exe 是 1663506 字节的自解压包,用现成的 7z 直接 x 就能拆开,不写注册表。

文件字节作用
7z.exe577536命令行主程序
7z.dll1908736全部压缩算法在这里
7zFM.exe1003520图形界面
7zG.exe725504图形界面的进度窗口
7-zip.dll101888资源管理器右键集成
Uninstall.exe17408卸载程序,绿色版用不上
安装器本体1663506自解压包,拆开即得上面这些
命令行最小集24862727z.exe 加 7z.dll
截图那个 zip1178064用来量界面启动的样本

命令行只要两个文件

7z.exe 加 7z.dll 就能完整工作,合起来 2486272 字节。剩下的图形界面和右键集成都可以不带,塞进 U 盘或者容器里只留这两个就够。

界面启动 0.41 秒

单独启动 7zFM.exe 打开一个 1178064 字节的 zip,窗口在 0.41 秒出现。界面依赖 7z.dll,把 dll 删了它会直接报错打不开。

五档压缩级别实测

样本是 291997198 字节、6104 个文件、2547 个目录的工程目录,里面混着 PHP 源码、JSON、XML 和几个已经压过的 zip。每档都新建一个存档,从头压一遍。

级别耗时产物字节占源体积
-mx=14298 毫秒9614259632.9 %
-mx=38759 毫秒9167653831.4 %
-mx=512416 毫秒8367117928.7 %
-mx=718700 毫秒7914399627.1 %
-mx=919308 毫秒7882408527.0 %
样本规模291997198 字节6104 个文件2547 个目录
mx9 比 mx5 多花6892 毫秒省 4847094 字节1.7 个百分点
mx7 比 mx9 少花608 毫秒多 319911 字节0.1 个百分点
mx9 比 mx1 多花15010 毫秒省 17318511 字节5.9 个百分点

最高档只比默认档省 4.85 个百分点

默认的 mx=5 用 12416 毫秒压到 28.7%,最高档 mx=9 用 19308 毫秒压到 27.0%。多花 6892 毫秒换来 1.7 个百分点,换算成体积是 4847094 字节。日常打包这个交换不划算。

mx=7 是个折中点

mx=7 用 18700 毫秒压到 27.1%,产物比 mx=9 大 319911 字节,却省下 608 毫秒。想省体积又不想多等一倍时间,7 比 9 更合适。

最低档快三倍

mx=1 只用 4298 毫秒,产物 32.9%。临时传个包、对方马上要解开,用这一档就够,比 mx=9 省 15010 毫秒。

界面里那两列体积

7zFM 打开 zip 后,列表里同时给「大小」和「压缩后大小」两列,压缩比根本不用算。截图那个包的总大小 1178064 字节,里面 2882048 字节的 exe 被压到 1115136 字节。

7-Zip 26.05 的 7zFM 打开一个 zip:大小与压缩后大小两列并排,2882048 字节的 exe 被压到 1115136 字节,特征列标着 UTF8

列截图里的值读法
大小2882048解压后的原始体积
压缩后大小1115136在包里占的字节
CRCEDF02E8B校验值,改一个字节就变
算法Deflate这个包用的是 zip 而不是 7z
特征UTF8文件名编码,中文名靠它不乱码

算法那列能看出包是哪来的

自己用 7z 压的显示 LZMA2,别人给的 zip 显示 Deflate。看到 Deflate 就知道压缩率有限,同样的内容换 7z 能再小一截。

UTF8 那列决定中文名

没有这个标记的 zip 在中文系统上解出来是乱码。解压前扫一眼特征列,比解完再改名省事。

装之前先确认三件事

安装器会写注册表、加右键菜单。不想留痕迹就用解出来的绿色目录,功能一样。

项本次实测说明
系统Windows 10 22H2(19045.6466)x64 包
授权LGPL 加 unRAR 限制可商用,RAR 解压部分有额外条款
写注册表安装器会写解压版不写
命令行最小集7z.exe 加 7z.dll2486272 字节

中文界面在 Lang 目录

解出来的包里有 Lang 目录,中文语言文件在里面。命令行版本不受影响,界面语言只跟这个目录有关。

右键菜单是 7-zip.dll 提供的

绿色版不解压 7-zip.dll 到系统目录,右键菜单就不会出现。要右键菜单只能跑安装器,这是两者的实际差别。

三个真会踩的地方

参数写在双横线后面就失效

7z a -- 包.7z 源\* -mx=9 里,-- 之后的东西全被当成文件名,-mx=9 变成了一个找不到的文件。实测五档压出来的体积一模一样,全是默认档的结果。参数必须写在 -- 之前。

压缩已压过的文件收益很低

目录里那几个 zip 和 7z 本身就是压缩数据,再压一遍几乎不掉体积。总量 32.9% 这个数字被它们拉高了,纯文本目录能压到一成以下。

大目录会吃满一个核

mx=9 那轮 19308 毫秒里,CPU 基本被单线程占满。同时跑别的编译任务,时间会明显变长,压之前先看一眼负载。

什么场景值得上

给客户发资料、给同事传工程目录这类事最合适。291997198 字节压到 83671179 字节,用默认档 12416 毫秒,比换 WinRAR 或者在线压缩省事得多。

反过来,只偶尔解一个别人给的 zip 的人用不上命令行。系统自带的解压已经够,装它主要是为了右键菜单和 7z 格式的压缩率。

项目数值
安装器字节1663506
命令行最小集2486272 字节
默认档压缩12416 毫秒 / 28.7 %
最高档压缩19308 毫秒 / 27.0 %
界面启动0.41 秒
压缩样本291997198 字节