【翻译精选】今年,我想向读者转发一篇由GionatanDanti撰写的有趣文章,发表在他的个人博客http://www.ilsistemista.net/,我希望你和我一样喜欢这篇文章。文件压缩是个老招数:最早可以压缩文章的软件之一是“SQ”,它的历史可以追溯到80年代初,而第一个被广泛使用和知名的压缩工具可能不是在1989年发布的,ZIP就是其中之一比。换句话说,压缩文件以节省存储空间并不是什么新鲜事;虽然TB范围内的低成本磁盘目前提供了巨大的空间,但压缩有时很受欢迎,因为加密不仅可以减少存储数据所需的空间,还可以减少写入或读取存储子系统的数据量,甚至可以提高I/O性能。如果您将越来越快的处理器速度与机械磁盘性能有些停滞(当然,SSD是另一回事)进行比较,则更是如此。尽管压缩算法和软件各不相同,但我们基本上可以将它们分为两类:普通的无损压缩工具和专门的有损压缩工具。后一类包括具有相当高压缩系数的压缩工具,它们通常仅在您想要保留整个一般消息但对准确表示原始数据的每一位不感兴趣时??才使用。换句话说,您可以使用有损压缩工具来存储高分辨率的照片或歌曲,而不是将压缩后的可执行文件存储到磁盘(可执行文件需要一点一点地存储***),或者存储文本日志文件(我们不想丢失有关文本文件的信息,对吗?)。所以,如果是一般的使用场合,无损压缩工具是最好的选择。但是有这么多可用的压缩工具,您应该选择哪一个呢?有时不同的压缩软件使用相同的基本算法,甚至是相同的库实现,因此使用哪种压缩工具是一个相对不重要的选择。但是,在比较使用不同压缩算法的压缩工具时,选择必然是一个权衡的选择:你看重的是高压缩比还是压缩速度?换句话说,你需要低压缩率的快速算法,还是高压缩率的快速算法?在本文中,我们将介绍几种基于几种不同压缩库的不同压缩工具:?lz4:一种新的高速压缩软件和算法。?lzop:基于fastlzo库,实现了LZO算法。?gzip和pigz(多线程gzip):基于zip库,实现了ZIP算法。?bzip2和pbzip2(多线程bzip2):基于libbzip2库,实现了Burrows–Wheeler压缩方法。?7-zip:主要(但不完全)基于LZMA算法。?xz:另一个基于LZMA的软件。软件、实现、库和算法在解释压缩原始、原始数据之前,澄清术语很有帮助。无损压缩算法是一种数学算法,它定义了如何在不丢失信息的情况下将特定数据集缩减(压缩)为较小的数据集。换句话说,它需要在不丢失信息的情况下使用比原始版本更少的比特来编码信息。为了有用,压缩算法必须是可逆的——它应该允许我们将压缩数据集恢复为原始源数据集的精确副本。不难看出,基本功能(压缩率、压缩率和压缩速度)是如何植根于算法本身的,不同算法的压缩结果和适应范围有很大差异。下一步是算法实现——简而言之,代表压缩算法数学行为的实际代码。这是另一个关键步骤:例如,矢量化或多线程代码比普通的单线程代码快得多。如果认为某个代码实现足够好,往往会单独打包,形成一个压缩库。将算法实现拆分在一个单独的库中的好处是,您可以编写很多不同的压缩软件,而不必多次重新实现基本算法。***,我们有压缩软件本身。压缩软件提供命令行界面(CLI)或图形用户界面(GUI),将用户与压缩库“耦合”在一起。有时算法、库和程序具有相同的名称(例如:zip)。有时,我们没有单独的库,而是完全在压缩软件中编译的。虽然这有点令人困惑,但上述内容仍然适用。总之,我们的基准测试将涵盖算法、库和软件,如下所示:测试台和方法论基准测试在具有以下系统的系统上运行:?PhenomII940处理器(四核@3.0GHz,1.8GHzMBL3缓存)?8GBDDR2-800DRAM(双通道内存模式)?ASUSM4A78Pro主板(使用AMD780G+SB700芯片组)?4x500GB硬盘(1xWesternDigital绿盘,3xSeagateCaviar),4个硬盘采用高级主机controllerinterface(AHCI)模式,配置方式采用软件RAID10“near”布局。?操作系统CentOS6.5x64我对两个不同数据集的压缩和解压缩进行了计时:1.包含未压缩的CentOS6.5最小安装/(root)映像的tar文件(不包括/boot)2.包含Linux3.14的tar文件。1个稳定的内核为了避免磁盘子系统的任何影响,我将两个数据集移动到/dev/shm目录,使用内存作为后备存储(您可以将其视为内存虚拟板)。如果可能,我尝试将单线程结果与多线程结果分开。但是,7-zip似乎没有线程选择选项;默认情况下,它会产生与处理器提供的一样多的硬件线程。因此,我用星号(*)标记了7-zip结果。许多压缩工具允许进行某种调整——例如,选择“-1”通常意味着比“-9”压缩速度更快(但效率更低)。我还在适用的地方试验了这些标记。压缩CentOS6.5根映像文件最好从压缩主要包含大量可执行文件的数据集开始我们的分析:最小的CentOS6.5根映像文件。可执行文件和二进制文件通常可以缩小,尽管压缩率有点低。如您所见,lz4和lzop都实现了压缩和解压缩速度快的承诺-但lz4显然是赢家。另一方面,它们的压缩系数相对较低。然而,要求他们增加压缩率(通过“-9”参数选项)会大大降低他们的速度并且不会产生明显更小的文件。Gzip尤其是bzip2表现不佳;虽然他们的压缩系列更高(3X),但他们的性能却严重下降。7-zip和xz的压缩速度都非常慢,但压缩率高,解压速度可以接受。请记住:这些是单线程结果。一些多线程压缩软件可用于充分利用具有多核的现代处理器:压缩缩放:Pigz、pbzip2和pxz都提供比单线程同类软件更好的结果。然而,虽然压缩缩放通常非常好,但只有pbzip2也能够更快地解压缩。#p#Compresslinuxkernel3.14.1sourcefiles源文件是文本文件,文本文件一般都有很好的压缩比。下面我们来看看这些压缩软件在压缩linuxkernel3.14.1tar源文件时的表现如何:虽然相对排名还是一样,但是我们可以看出两点不同:1.不出所料,压缩率略高.2.与上一轮测试相比,lzop在压缩时要快很多。现在看多线程测试部分:Compressionscaling:Compressionscaling仍然很出色,pxz排在最后。结论从上述基准测试可以清楚地看出,每个压缩软件都有其特定的用例:?lz4和lzop非常适合实时或接近实时的压缩,速度非常快,具有节省大量空间的优势。?gzip,尤其是多线程pgiz版本,非常适合一般用途:它具有相当高的压缩率并且速度不慢。?普通的单线程bzip2性能不是很好:压缩因子和速度不如xz。只有优秀的pbzip2多线程实现在一定程度上弥补了这一点。?xz在压缩率方面是明显的赢家,但它是压缩和解压缩速度较慢的软件之一。如果您主要关心的是压缩率而不是速度(例如在线存档文件下载),那么您就不会出错。?7zip基本上是xz的衍生产品,但其主要实现属于windows生态系统。在Linux下,只需使用xz而不是7-zip。英文:http://linuxaria.com/article/linux-compressors-comparison-on-centos-6-5-x86-64-lzo-vs-lz4-vs-gzip-vs-bzip2-vs-lzma
