写点什么

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

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

关注

评论

发布
暂无评论

架构实战营 - 模块五作业(微博评论)

🐢先生

架构实战营

作为移动开发你不能不了解的编译流程

京东科技开发者

编译器 移动开发 京东云 京东技术

gt-checksum 1.2.1发布,新增表结构校验及修复等超实用特性

GreatSQL

MySQL greatsql社区 gt-check

系统设计的端到端原则

俞凡

架构

开源可观测性平台SigNoz

骑牛上青山

开源 调用链 OpenTelemetry signoz

Bytebase 体验官之狂飙的 ChatGPT

朱亚光

中台的悖论

agnostic

中台

常用对话框基本使用

芯动大师

dialog timepicker progress

运维训练营第19周作业

好吃不贵

利用 ChangeStream 实现 Amazon DocumentDB 表级别容灾复制

亚马逊云科技 (Amazon Web Services)

在京东如何做好前端系统的可观测性

京东科技开发者

前端 京东云 京东技术

交易履约之产品中心实践

京东科技开发者

交易 京东云 京东技术 京东科技 产品中心

希望计算机专业同学都知道这些宝藏博主

程序员大彬

自学编程 计算机 计算机专业

软件测试/测试开发丨持续交付-Pipeline入门

测试人

软件测试 自动化测试 测试开发

美团:某动态线程池框架是官方开源的么?

马丁玩编程

线程池 美团线程池

基于 Kafka 和 Elasticsearch 构建实时站内搜索功能的实践

京东科技开发者

MySQL ES 京东云 京东物流 京东技术

如何实现云数据治理中的数据安全?

京东科技开发者

云计算 大数据 数据治理 企业号 3 月 PK 榜 计算资源

实现常驻任务除了避免昙花线程,还需要避免重返线程池

newbe36524

C#

聊一聊系统重构

如何把握未来技术的演进方向

Ethan

CMS系统是什么?

源字节1号

开源 软件开发 前端开发 后端开发 小程序开发

人工智能与软件工程

紫晖

人工智能 机器学习 软件工程 工程

手把手带你上手ChatGPT

老周聊架构

3月月更 ChatGPT

一文吃透扫码登录原理

程序员大彬

Java java面试 扫码

软件测试/测试开发丨MockServer 服务框架设计

测试人

软件测试 自动化测试 测试开发

AR市场为何频频“呼唤”苹果?

Alter

AR

什么是容器编排及编排的优点

黎博

容器编排 Kubernetes Serverless

如何实现云数据治理中的数据安全?

京东科技开发者

数据库 云计算 京东云 京东技术

Three.js 进阶之旅:物理效果-3D乒乓球小游戏 🏓

dragonir

CSS JavaScript 前端 React three.js

软件测试/测试开发丨持续交付-Blue Ocean 应用

测试人

软件测试 自动化测试 测试开发

软件测试/测试开发丨持续交付-Jenkinsfile 语法

测试人

软件测试 自动化测试 测试开发

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