QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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:009535
用户头像

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

关注

评论

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

应用缺少POI数据,如何开发地点深度信息?

HarmonyOS SDK

预约直播 | 基于预训练模型的自然语言处理及EasyNLP算法框架

阿里云大数据AI技术

深度学习 阿里云 算法框架

Promise.allSettled 的 Polyfill 处理

汪子熙

JavaScript Promise Async 8月月更 web编程

什么是文件存储?与对象存储有什么区别?

wljslmz

文件存储 8月月更

设备管理|风机的日常运行与维护

PreMaint

企业设备管理 预测性维护 设备健康管理 风机的日常运维

开源一夏 | 使用 JavaScript 将文本转换为文件

海拥(haiyong.site)

JavaScript GitHub 开源 前端 8月月更

我做了个《联机桌游合集: UNO+斗地主+五子棋》无需下载,点开即玩!叫上朋友,即刻开局!不看广告,不做任务,享受「纯粹」的游戏!

HullQin

CSS JavaScript html 前端 8月月更

低代码实现探索(四十八)后端服务

零道云-混合式低代码平台

基于CC2530(ZigBee)设计的景观照明控制系统+配套手机APP

DS小龙哥

8月月更

Web登录很简单?开玩笑!

TimeFriends

8月月更

悟了,应该都了解分布式架构下负载均衡器吧

知识浅谈

负载均衡 8月月更

CSS

武师叔

8月月更

云原生(二十) | 深入了解Kubernetes(k8s)Service

Lansonli

云原生 k8s 8月月更

圣庭医疗联合创始人谷红仓:高通量基因测序在药物研发和靶向治疗中的应用

阿里云弹性计算

HPC 高性能计算 生命科学 基因测序

3 分钟温故知新 RxJS 【创建实例操作符】

掘金安东尼

前端 函数式编程 8月月更

腾讯发布第二季度财报,腾讯云数据库收入同比增长超过30%

科技热闻

计算机网络(二、物理层)

计算机网络 8月月更

组件解析:基础组件button的实现

独来独往

大前端 低代码 可视化 组件化 低代码平台

GitHub标星139K的:“嵌入式Linux系统开发教程”

收到请回复

Java Linux 程序员 嵌入式 #运维

迄今为止最完整的DDD实践

阿里技术

DDD 经验分享

【LeetCode】课程表Java题解

Albert

LeetCode 8月月更

直播商城系统——直播和电商的合理有效结合

开源直播系统源码

软件开发 直播系统源码 直播带货系统 直播商城系统 直播app系统

五分钟给你的 gRPC 服务加上 HTTP 接口

万俊峰Kevin

Go 微服务 gRPC web开发 go-zero

阿里云鲍文乐:基于事件的自动化运维最佳实践

阿里云弹性计算

事件 自动化运维 CloudOps

付费会员之我见(43/100)

hackstoic

商业模式

借我 1 小时,与 1000 人一起参与开源

腾源会

开源 腾源会

少儿编程是智商税吗?不花钱让孩子赢在起跑线!

博文视点Broadview

【React源码系列】React Context原理,为什么我建议尽可能少的使用React Redux管理状态 审核中

爱切图的木子老师

react源码 react context react redux

寻找海量数据集用于大数据开发实战(维基百科网站统计数据)

程序员欣宸

大数据 数据集 8月月更

Go-Excelize API源码阅读(十三)—— GetSheetVisible、SetSheetFormatPr

Regan Yue

Go 开源 源码解析 8月日更 8月月更

AntDB基于WAL日志的DML数据闪回实现

亚信AntDB数据库

AntDB 国产数据库 AISWare AIDB

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