非死book开源新的压缩算法,性能超zlib
jopen 8年前
<p>近日,非死book <a href="/misc/goto?guid=4958993600677354150" rel="nofollow,noindex">开源</a> 了新的压缩算法 <a href="/misc/goto?guid=4958993600808527590" rel="nofollow,noindex">Zstandard 1.0</a> 。据非死book工程师 <a href="/misc/goto?guid=4958993600936388940" rel="nofollow,noindex">Yann Collet</a> 和Chip Turner介绍,该算法是少数能够在性能和效率方面超过zlib的压缩算法之一,而后者当前是“占统治地位的标准”。非死book Zstandard利用了 <a href="/misc/goto?guid=4958863538525289795" rel="nofollow,noindex">Collet之前所做的工作</a> 。Collet是 <a href="/misc/goto?guid=4958863538816264338" rel="nofollow,noindex">LZ4</a> 的作者,他在 <a href="/misc/goto?guid=4958993601136488559" rel="nofollow,noindex">2015</a> 年发布了其新算法的第一个版本。</p> <p>非死book的基准测试显示,在任意压缩率和压缩带宽组合下,Zstandard的性能都要高于zlib。</p> <p><img alt="非死book开源新的压缩算法,性能超zlib" src="https://simg.open-open.com/show/44640aa3cce562971611328f6bb75ed8.jpg" /></p> <p>特别地,当使用标准无损压缩语料库 <a href="/misc/goto?guid=4958993601255721454" rel="nofollow,noindex">Silesia</a> 时,相比zlib,Zstandard展示了出色的性能:</p> <ul> <li> <h3><sub>在压缩率相同的情况下,它的速度快大约3到5倍;</sub></h3> </li> <li> <h3><sub>在压缩速度相同的情况下,它生成的文件小10%到15%;</sub></h3> </li> <li> <h3><sub>不管压缩率多大,它解压缩的速度都要快2倍;</sub></h3> </li> <li> <h3><sub>它的最大压缩率要高许多(大约为4比3.15)。</sub></h3> </li> </ul> <p>Zstandard使用了 <a href="/misc/goto?guid=4958993601380247397" rel="nofollow,noindex">有限状态熵</a> ,并以Jarek Duda在熵编码 <a href="/misc/goto?guid=4958993601509416167" rel="nofollow,noindex">非对称数字系统</a> (ANS)方面的工作为基础。ANS的目标是“避免在压缩速度和压缩率之间进行取舍”,它既可以用于精确编码,也可以用于快速编码,并且支持数据加密。但是,从根本上讲,Zstandard之所以提供了更好的性能是因为它的多项设计和实现选择。</p> <ul> <li>zlib受一个32KB的窗口限制,而Zstandard并没有任何固有的限制,它可以更充分地利用现代环境中的内存,包括移动和嵌入式环境。</li> <li>一个新的Huffman解码器 <a href="/misc/goto?guid=4958863539206647537" rel="nofollow,noindex">Huff0</a> 。它可以借助多个 <a href="/misc/goto?guid=4958993601678532228" rel="nofollow,noindex">ALU</a> 并行解码符号,减少算术操作之间的依赖。</li> <li> <p>Zstandard设法尽量减少分支,从而将因为分支预测错误而导致的、开销很高的管道清理最小化。下面的例子展示了如何在不使用分支的情况下重写while循环:</p> <pre> /* 经典版本 */ while (nbBitsUsed >= 8) { /* 每个while测试都是一个分支 */ accumulator <<= 8; accumulator += *byte++; nbBitsUsed -= 8; } /* 无分支版本 */ nbBytesUsed = nbBitsUsed >> 3; nbBitsUsed &= 7; ptr += nbBytesUsed; accumulator = read64(ptr);</pre> </li> <li> <p>对于差别只有几个字节的序列,重复码建模极大地改善了压缩。</p> </li> </ul> <p>Zstandard是使用C语言编写的。它既是一个命令行工具,也是一个库。它提供了20多个压缩级别,让用户可以根据具体可用的硬件、待压缩的数据和待优化的瓶颈进行仔细地调整。非死book建议开始时使用默认级别3。该级别适合大多数情况。然后,可以尝试9以下的级别,合理地平衡速度和空间,或者使用更高的级别获得更高的压缩率,而20以上的级别则适合那些你不关心压缩速度的情况。</p> <p>对于Zstandard的未来版本会带来什么特性,Collet和Turner也提供了一些信息,其中包括支持多线程,以及可以提供更快压缩速度和更高压缩率的新的压缩级别。</p> <p>Zstandard是继苹果的ZLFSE和谷歌的 <a href="/misc/goto?guid=4958993601803183992" rel="nofollow,noindex">Brotli</a> 之后的又一个开源压缩算法。ZLFSE和Brotli都是开源的,每一种算法都针对特定的应用场景进行了优化:Brotli似乎为实现Web资产和Android APK的高压缩率进行了 <a href="/misc/goto?guid=4958993601919647490" rel="nofollow,noindex">优化</a> ,而LZFSE的目标是,在压缩率相同的情况下,提供比zlib更快的压缩速度和更低的电量消耗。</p> <p> </p> <p>来自: http://www.infoq.com/cn/news/2016/09/非死book-zstandard-compression</p> <p> </p> <p> </p>