写点什么

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

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

关注

评论

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

Java进阶(五)Junit测试

No Silver Bullet

JUnit 测试 单元测试 9月月更

库调多了,都忘了最基础的概念-《方法篇》

知识浅谈

9月月更

云资源管理概述

阿泽🧸

云资源 9月月更

信息安全之我见(45/100)

hackstoic

信息安全

你猜 1 行Python代码能干什么呢?神奇的单行 Python 代码

梦想橡皮擦

Python Python. 9月月更

深入学习SAP UI5框架代码系列之二:UI5 Module的懒加载机制

汪子熙

JavaScript 前端框架 SAP ui5 9月月更

你真的理解C语言中的 “ 数组 ” 吗?(初阶篇)

Albert Edison

数组 C语言 开发语言 二维数组 9月月更

云原生(三十六) | Kubernetes篇之Harbor入门和安装

Lansonli

云原生 9月月更

致敬经典!这款华为主题能让你的手机秒变“历代Mate”

最新动态

[教你做小游戏] 滑动选中!PC端+移动端适配!完美用户体验!斗地主手牌交互示范

HullQin

CSS JavaScript html 前端 9月月更

LeetCode-35. 搜索插入位置(java)

bug菌

9月日更 Leet Code 9月月更

使用 VUE 和 Go 触摸 WebAssembly

devpoint

Go Vue webassembly 9月月更

2022-09-04:以下go语言代码输出什么?A:不能编译;B:45;C:45.2;D:45.0。 package main import ( “fmt“ ) func main() {

福大大架构师每日一题

golang 福大大 选择题

随机生成也是需要有效控制的

zxhtom

9月月更

浅述AIOps与DevOps的区别在哪里

穿过生命散发芬芳

DevOps AIOPS 9月月更

【CSS】 position : static | absolute | relative | fixed | sticky

翼同学

CSS 前端 9月月更

Containerd ctr、crictl、nerdctl 实战

CTO技术共享

生产环境中使用 Linkerd

CTO技术共享

神级编程网站,堪称程序员的充电站,我给你找好了不能错过

C语言与CPP编程

编程 程序员 网站 计算机 编程语言‘

一款开源的电商框架介绍:Spartacus

汪子熙

typescript angular SAP Spartacus 9月月更

自动化测试如何管理测试数据

老张

自动化测试

leetcode 148. Sort List 排序链表(中等)

okokabcd

LeetCode 算法与数据结构

计算机网络的组成

StackOverflow

编程 计算机网络 9月月更

查看k8s的etcd数据

程序员欣宸

Kubernetes 9月月更

真的破防了!在华为主题熄屏显示找到我的第一台Mate

最新动态

云原生的学习心得

Geek_e8bfe4

YAML管理Kubernetes应用

CTO技术共享

《小米创业思考》之一:小米历程

郭明

读书笔记

Java进阶(四)Java反射TypeToken解决泛型运行时类型擦除问题

No Silver Bullet

Java 反射 9月月更 typeToken

「趣学前端」SVG,边学边做

叶一一

JavaScript 前端 9月月更

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