近日,F(xiàn)acebook開(kāi)源了新的壓縮算法Zstandard 1.0。據(jù)Facebook工程師Yann Collet和Chip Turner介紹,該算法是少數(shù)能夠在性能和效率方面超過(guò)zlib的壓縮算法之一,而后者當(dāng)前是“占統(tǒng)治地位的標(biāo)準(zhǔn)”。Facebook Zstandard利用了Collet之前所做的工作。Collet是LZ4的作者,他在2015年發(fā)布了其新算法的第一個(gè)版本。
Facebook的基準(zhǔn)測(cè)試顯示,在任意壓縮率和壓縮帶寬組合下,Zstandard的性能都要高于zlib。
特別地,當(dāng)使用標(biāo)準(zhǔn)無(wú)損壓縮語(yǔ)料庫(kù)Silesia時(shí),相比zlib,Zstandard展示了出色的性能:
在壓縮率相同的情況下,它的速度快大約3到5倍; 在壓縮速度相同的情況下,它生成的文件小10%到15%; 不管壓縮率多大,它解壓縮的速度都要快2倍; 它的最大壓縮率要高許多(大約為4比3.15)。Zstandard使用了有限狀態(tài)熵,并以Jarek Duda在熵編碼非對(duì)稱數(shù)字系統(tǒng)(ANS)方面的工作為基礎(chǔ)。ANS的目標(biāo)是“避免在壓縮速度和壓縮率之間進(jìn)行取舍”,它既可以用于精確編碼,也可以用于快速編碼,并且支持?jǐn)?shù)據(jù)加密。但是,從根本上講,Zstandard之所以提供了更好的性能是因?yàn)樗亩囗?xiàng)設(shè)計(jì)和實(shí)現(xiàn)選擇。
zlib受一個(gè)32KB的窗口限制,而Zstandard并沒(méi)有任何固有的限制,它可以更充分地利用現(xiàn)代環(huán)境中的內(nèi)存,包括移動(dòng)和嵌入式環(huán)境。 一個(gè)新的Huffman解碼器Huff0。它可以借助多個(gè)ALU并行解碼符號(hào),減少算術(shù)操作之間的依賴。Zstandard設(shè)法盡量減少分支,從而將因?yàn)榉种ьA(yù)測(cè)錯(cuò)誤而導(dǎo)致的、開(kāi)銷(xiāo)很高的管道清理最小化。下面的例子展示了如何在不使用分支的情況下重寫(xiě)while循環(huán):
/* 經(jīng)典版本 */while (nbBitsUsed >= 8) { /* 每個(gè)while測(cè)試都是一個(gè)分支 */ accumulator <<= 8; accumulator += *byte++; nbBitsUsed -= 8;}/* 無(wú)分支版本 */nbBytesUsed = nbBitsUsed >> 3;nbBitsUsed &= 7;ptr += nbBytesUsed;accumulator = read64(ptr);對(duì)于差別只有幾個(gè)字節(jié)的序列,重復(fù)碼建模極大地改善了壓縮。
Zstandard是使用C語(yǔ)言編寫(xiě)的。它既是一個(gè)命令行工具,也是一個(gè)庫(kù)。它提供了20多個(gè)壓縮級(jí)別,讓用戶可以根據(jù)具體可用的硬件、待壓縮的數(shù)據(jù)和待優(yōu)化的瓶頸進(jìn)行仔細(xì)地調(diào)整。Facebook建議開(kāi)始時(shí)使用默認(rèn)級(jí)別3。該級(jí)別適合大多數(shù)情況。然后,可以嘗試9以下的級(jí)別,合理地平衡速度和空間,或者使用更高的級(jí)別獲得更高的壓縮率,而20以上的級(jí)別則適合那些你不關(guān)心壓縮速度的情況。
對(duì)于Zstandard的未來(lái)版本會(huì)帶來(lái)什么特性,Collet和Turner也提供了一些信息,其中包括支持多線程,以及可以提供更快壓縮速度和更高壓縮率的新的壓縮級(jí)別。
Zstandard是繼蘋(píng)果的ZLFSE和谷歌的Brotli之后的又一個(gè)開(kāi)源壓縮算法。ZLFSE和Brotli都是開(kāi)源的,每一種算法都針對(duì)特定的應(yīng)用場(chǎng)景進(jìn)行了優(yōu)化:Brotli似乎為實(shí)現(xiàn)Web資產(chǎn)和Android APK的高壓縮率進(jìn)行了優(yōu)化,而LZFSE的目標(biāo)是,在壓縮率相同的情況下,提供比zlib更快的壓縮速度和更低的電量消耗。