写点什么

Facebook 开源新的压缩算法,性能超 zlib

  • 2016-09-05
  • 本文字数:1231 字

    阅读完需:约 4 分钟

近日,Facebook开源了新的压缩算法 Zstandard 1.0 。据 Facebook 工程师 Yann Collet 和 Chip Turner 介绍,该算法是少数能够在性能和效率方面超过 zlib 的压缩算法之一,而后者当前是“占统治地位的标准”。Facebook Zstandard 利用了 Collet 之前所做的工作。Collet 是 LZ4 的作者,他在 2015 年发布了其新算法的第一个版本。

Facebook 的基准测试显示,在任意压缩率和压缩带宽组合下,Zstandard 的性能都要高于 zlib。

特别地,当使用标准无损压缩语料库 Silesia 时,相比 zlib,Zstandard 展示了出色的性能:

  • 在压缩率相同的情况下,它的速度快大约 3 到 5 倍;
  • 在压缩速度相同的情况下,它生成的文件小 10% 到 15%;
  • 不管压缩率多大,它解压缩的速度都要快 2 倍;
  • 它的最大压缩率要高许多(大约为 4 比 3.15)。

Zstandard 使用了有限状态熵,并以 Jarek Duda 在熵编码非对称数字系统(ANS)方面的工作为基础。ANS 的目标是“避免在压缩速度和压缩率之间进行取舍”,它既可以用于精确编码,也可以用于快速编码,并且支持数据加密。但是,从根本上讲,Zstandard 之所以提供了更好的性能是因为它的多项设计和实现选择。

  • zlib 受一个 32KB 的窗口限制,而 Zstandard 并没有任何固有的限制,它可以更充分地利用现代环境中的内存,包括移动和嵌入式环境。
  • 一个新的 Huffman 解码器 Huff0 。它可以借助多个 ALU 并行解码符号,减少算术操作之间的依赖。
  • Zstandard 设法尽量减少分支,从而将因为分支预测错误而导致的、开销很高的管道清理最小化。下面的例子展示了如何在不使用分支的情况下重写 while 循环:
复制代码
/* 经典版本 */
while (nbBitsUsed >= 8) { /* 每个 while 测试都是一个分支 */
accumulator <<= 8;
accumulator += *byte++;
nbBitsUsed -= 8;
}
/* 无分支版本 */
nbBytesUsed = nbBitsUsed >> 3;
nbBitsUsed &= 7;
ptr += nbBytesUsed;
accumulator = read64(ptr);
  • 对于差别只有几个字节的序列,重复码建模极大地改善了压缩。

Zstandard 是使用 C 语言编写的。它既是一个命令行工具,也是一个库。它提供了 20 多个压缩级别,让用户可以根据具体可用的硬件、待压缩的数据和待优化的瓶颈进行仔细地调整。Facebook 建议开始时使用默认级别 3。该级别适合大多数情况。然后,可以尝试 9 以下的级别,合理地平衡速度和空间,或者使用更高的级别获得更高的压缩率,而 20 以上的级别则适合那些你不关心压缩速度的情况。

对于 Zstandard 的未来版本会带来什么特性,Collet 和 Turner 也提供了一些信息,其中包括支持多线程,以及可以提供更快压缩速度和更高压缩率的新的压缩级别。

Zstandard 是继苹果的 ZLFSE 和谷歌的 Brotli 之后的又一个开源压缩算法。ZLFSE 和 Brotli 都是开源的,每一种算法都针对特定的应用场景进行了优化:Brotli 似乎为实现 Web 资产和 Android APK 的高压缩率进行了优化,而LZFSE 的目标是,在压缩率相同的情况下,提供比zlib 更快的压缩速度和更低的电量消耗。

查看英文原文 Facebook Open-Sources New Compression Algorithm Outperforming Zlib

2016-09-05 19:009971
用户头像

发布了 1008 篇内容, 共 442.9 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

一篇文章,全面总结2020最新整理-Android-大厂高频面试知识点

android 程序员 移动开发

Microchip发布2.3版TimeProvider® 4100主时钟授时和同步系统

专科毕业,我是如何拿到字节跳动、网易双offer的,白嫖党最爱

android 程序员 移动开发

一文了解AndroidStudio3-4的全部更新,androidapp开发从入门到精通

android 程序员 移动开发

一款简单的消息防抖框架,安卓开发权威指南

android 程序员 移动开发

不是吧!做了3年Android还没看过OkHttp源码?好吧,kotlin开源

android 程序员 移动开发

一种清晰, 便于扩展android项目架构方案,kotlin编程

android 程序员 移动开发

一文读懂深克隆与浅克隆的关系

Tom弹架构

Java 架构 设计模式

《穷爸爸富爸爸》

石云升

投资理财 11月日更

业余时间如何开发一个App?出于好奇心QiShare带你体验一下 _ 创作者训练营第二期

android 程序员 移动开发

hadoop源码编译参考

Clarke

一种有效管控APP隐私权限的解决方案,Android400道面试题通关宝典助你进大厂

android 程序员 移动开发

一篇看懂Android与Flutter之间的通信,最新Android开发面试解答

android 程序员 移动开发

不愧是阿里技术官,Android-Framework的精髓全写在这本“限量笔记

android 程序员 移动开发

不知道这些你就OUT了,2019年最常见又实用的Android开发面试题

android 程序员 移动开发

下次一定会成,Android面试血泪教训(九场面试的经验与得失

android 程序员 移动开发

不愧是阿里技术官,Android Framework的精髓全写在这本“限量笔记

android 程序员 移动开发

与面试官的一次促膝长谈:人家也是第一次当面试官,你们答不上来我也特别尴尬

android 程序员 移动开发

专科渣校,呕心沥血在家3个月“拿下”330页PDF,终于拿下阿里OFFer

android 程序员 移动开发

一篇文章让你彻底了解三次握手和四次挥手,轻松拿下offer

android 程序员 移动开发

一起来看看 Android 官推 kotlin-first 的图片加载库(1)

android 程序员 移动开发

一键登录已成大势所趋,Android端操作指南来啦!,handler机制的原理面试

android 程序员 移动开发

三年开发经验,跳槽腾讯音乐,三面斩获Offer,Android入门教程

android 程序员 移动开发

一线互联网技术总监的忠告:我们精通那么多技术为何还是做不好一个项目?

android 程序员 移动开发

一线大厂大型APP性能优化系列-自定义启动器(三),2020-2021阿里巴巴安卓面试真题解析

android 程序员 移动开发

三年Android开发却只有一年工作经验,是怎么收到offer的?

android 程序员 移动开发

一文带你搞懂Android的-Binder-机制,flutterandroid最低版本

android 程序员 移动开发

一行代码解决安卓重复点击,稳进大厂

android 程序员 移动开发

专科 二本程序员的“黄金五年”该如何规划,kotlin协程和线程的区别

android 程序员 移动开发

一篇通俗易懂的Android视图系统设计与实现,精通android网络开发pdf

android 程序员 移动开发

专科培训班出生,四年换四次工作被朋友嘲笑面霸!最终拿下字节跳动Offer年薪57w

android 程序员 移动开发

Facebook开源新的压缩算法,性能超zlib_开源_Sergio De Simone_InfoQ精选文章