到目前为止,我曾经使用tar
LZMA 压缩选项之一(--lzma
、--xz
或--lzip
)来备份数据
我最近注意到 7-Zip 已于 2021 年移植到 Linux(https://www.xda-developers.com/7-zip-linux-official-release/)。我不是在谈论较旧的 P7Zip (https://p7zip.sourceforge.net/),这似乎不再维护,而是关于官方 7-Zip。
因此,我对其进行了测试,并且非常惊讶地发现,对于相同的压缩比,它比所有其他 Linux LZMA 实现要快得多。
以下是我的测试(Debian 11)。请注意,我在每次测试之间清空了 RAM 缓存 ( sync && echo 3 > /proc/sys/vm/drop_caches
)
我正在处理一个163M的文件夹,包含几种类型的文件,PDF,文本,开放办公室等等......
$ du -hs TEST/
163M TEST/
使用 7-Zip,它可以在 15 秒内压缩成 127M 的文件:
$ time tar c -hp TEST/ | 7zz a -si test.tar.7z
real 0m14,565s
(...)
$ ll test.tar.7z
(...) 127M (...) test.tar.7z
而对于 LZMA 的所有其他实现,对于相同的存档大小,它花费的时间几乎是 5 倍(大约 1'13")!
$ time tar -chp --lzma -f test.tar.lzma TEST/
real 1m13,159s
$ time tar -chp --xz -f test.tar.xz TEST/
real 1m12,889s
$ time tar -chp --lzip -f test.tar.lz TEST/
real 1m12,525s
$ ll test.tar.{7z,lz*,xz}
(...) 127M (...) test.tar.7z
(...) 127M (...) test.tar.lz
(...) 127M (...) test.tar.lzma
(...) 127M (...) test.tar.xz
为了确保 没有任何问题tar
,我做了相同的测试,但tar
将 的输出通过管道传输到lzma|xz|lzip
, 而不是使用--lzma
,--xz
和--lzip
开关。结果相同。
所以,基本上,7-Zip 的 Linux 版本让所有其他 LZMA 实现看起来相当黯淡。我认为 7-Zip 不支持 Linux 所有者和权限,但这在压缩文件时无关紧要.tar
。
那么,有人知道为什么 7-Zip 的 Linux 版本比其他 LZMA 实现快得多吗?
答案1
我找到了我的问题的答案。基本上,它看起来7zz
默认是多线程的,但xz
or的情况并非如此lzip
。在等式中加入多线程,结果会变得更加接近,即使 7-Zip 仍然更快一些:
$ time tar c -hp TEST/ | 7zz a -si test.tar.7z
real 0m17,986s
// free memory
$ time tar c -hp TEST/ | xz --threads=0 > test.tar.xz
real 0m22,920s
// free memory
$ sudo apt install plzip
$ time tar -chp --lzip -f test.tar.lz TEST/
real 0m20,134s
有趣的是,安装plzip
(并行 lzip)可以tar --lzip
自动使用它(可能是因为/usr/bin/lzip
成为 的符号链接/usr/bin/lzip.plzip
,至少在 Debian 中)。
[ 编辑 ]
另外,请注意从5.5.1版本开始(2024 年 1 月),我没有使用,xz
默认是多线程的:
多线程模式现在是默认模式。这提高了压缩速度并创建可以多线程解压缩的 .xz 文件,但代价是增加了内存使用量并且压缩率稍差。
答案2
7zz用途手写汇编、p7zip 和 xz 没有。
此外,XZ 的 LZMA 实现已经非常过时了。在过去的七年中,伊戈尔·巴甫洛夫 (Igor Pavlov) 对 7-zip 进行了大量更改,以加快速度。