为什么 7-zip 比 Linux 中的其他 LZMA 实现快得多?

为什么 7-zip 比 Linux 中的其他 LZMA 实现快得多?

到目前为止,我曾经使用tarLZMA 压缩选项之一(--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默认是多线程的,但xzor的情况并非如此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 进行了大量更改,以加快速度。

相关内容