Zstandard:一种新的无损压缩算法

Zstandard(缩写为Zstd)是一种新的无损压缩算法,旨在提供快速压缩,并实现高压缩比。它既不像LZMAZPAQ那样追求尽可能高的压缩比,也不像LZ4那样追求极致的压缩速度。

下面是一组基准测试数据:


压缩算法名称


压缩比


压缩速度(MB/s)


解压速度(MB/s)


zlib 1.2.8 -6


3.099


18


275


Zstd


2.872


201


498


zlib 1.2.8 -1


2.73


58


250


LZ4 HC r127


2.72


26


1720


QuickLZ 1.5.1b6


2.237


323


373


LZO 2.06


2.106


351


510


Snappy 1.1.0


2.091


238


964


LZ4 r127


2.084


370


1590


LZF 3.6


2.077


220


502

(环境:Core i5-4300U @ 1.9GHZ;基准测试程序:开源程序fsbench 0.14.3

从上表可以看出,Zstd的压缩比和压缩速度都比较高,而且解压速度大约为每核500MB/s。

Zstd的压缩速度可以根据不同的情况进行配置。在上述测试中,它提供了大约每核200MB/s的速度,可以用于一些实时压缩场景。同时,与LZ4类似,它可以提供平衡压缩比和压缩时间的衍生算法,并且不影响解压性能。

Zstd还有一个特点是内存需求可配置。这使它可以适应内存配置低或者服务器并行处理多个请求的情况。此外,它采用了“有限状态熵(Finite State Entropy,缩写为FSE)”编码器。该编码器是由Jarek Duda基于ANS理论开发的一种新型熵编码器,旨在与“霍夫曼编码器(Huffman encoder)”和“算数编码器(Arithmetic encoder)”相竞争。

另据Cyan4973项目创建者Yann Collet介绍,虽然Zstd是一个速度很快的压缩/解压算法,但它并没有进入LZ4的适用范围。在一项基准测试中(测试方法见这里),Collet得出了这样的结论:

当传输速度高于50MB/s时,LZ4是更好的选择;而当传输速度介于0.5MB/s和50MB/s时,Zstd在速度上领先于其它算法。

此外,在回复用户评论时,Collect比较了Zstd与lzham

根据我的理解,它们的设计出发点不同。Lzham来源于LZMA……以离线压缩场景作为衡量标准……而Zstd的基本原则更像Zlib,但主要有三点变化:

  • FSE代替霍夫曼编码器;
  • 不限匹配尺寸;
  • 偏移量可重复。

最后,请读者朋友们注意:Zstd开发尚处于起步阶段,本文的一些测试结果也只是早期的测试结果,其实现将会随着时间的推移继续改进和提高,尤其是在项目创建的第一年里。

时间: 2024-08-09 22:30:28

Zstandard:一种新的无损压缩算法的相关文章

无损压缩算法历史

引言 无损压缩算法可行的基本原理是,任意一个非随机文件都含有重复数据,这些重复数据可以通过用来确定字符或短语出现概率的统计建模技术来压缩.统计模型可以用来为特定的字符或者短语生成代码,基于它们出现的频率,配置最短的代码给最常用的数据.这些技术包括熵编码(entropy encoding),游程编码(run-length encoding),以及字典压缩.运用这些技术以及其它技术,一个8-bit长度的字符或者字符串可以用很少的bit来表示,从而大量的重复数据被移除. 历史 直到20世纪70年代,数

二十八、带给我们一种新的编码思路——EFW框架CS系统开发中的MVC模式探讨

回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.3:http://pan.baidu.com/s/1c0dADO0 EFW框架实例源代码下载:http://pan.baidu.com/s/1eQCc69G       前言:记得最初写出Winform版MVC的代码是在公司的一个产品中,产品有几个界面功能比较多,一个界面窗体的代码尽然有1万多行代码,让我们在维护这几个界面的时候非常的痛苦,你可能想可以把这个大的界面拆分成几个小的界面在集成在一起不就好了,但实际上这样

6:知识的领域和结构,一种新的奇思妙想的组合结合

1.三个案例 案例1:幼儿的语言学习 可见现象: 1.听音学语言,只有声音--结果:学不会 2.听看学语言,声音和画面--结果:很容易学会 通过不断的倾听声音和观察的画面形成关联 案例2:PPT训练营 可见现象: 操作技巧很熟练,但是成品整体水平很差劲. 做好PPT的3个领域知识: 1.PPT操作技巧: 插入元素.母版.快捷键.动画 2.足够的审美知识: 空间结构.颜色搭配.元素设计 3.足够的逻辑能力 结构大纲.先后顺序.语言提炼 案例3:记忆数字 一样长度的数字,有些容易记忆有些却很难 20

发表在 Science 上的一种新聚类算法

今年 6 月份,Alex Rodriguez 和 Alessandro Laio 在 Science 上发表了一篇名为<Clustering by fast search and find of density peaks>的文章,为聚类算法的设计提供了一种新的思路.虽然文章出来后遭到了众多读者的质疑,但整体而言,新聚类算法的基本思想很新颖,且简单明快,值得学习.这个新聚类算法的核心思想在于对聚类中心的刻画上,本文将对该算法的原理进行详细介绍,并对其中的若干细节展开讨论. 最后,附上作者在补充

关于一种新的问答模式的思考

前言 作为一名开发者,我们每天可能会遇到各种各样的问题,当我们自己不能独立解决该问题的时候,就会在各大社区求助,期望有高人能够帮助我们解决该问题.但是现实是残酷的,我们美好的想法可能绝大多数会落空,如果能够有一种全新的模式帮助您解决了该问题,还让您清晰的了解这个问题的始末,而且最关键的是,还有一篇专门针对该问题的技术博客,您觉得会怎么样呢? 背景 程序员在日常开发工作中,经常会遇到各种各样的问题,当我们遇到问题且自己不能独立解决的时候,就会想到在各大社区的问答区提问.我们发现其实大多数问题都没有

5、三种新方法判断是否包含字符串/repeat()方法

传统上,JavaScript只有indexOf方法,来判断一个字符串是否包含在另一个字符串中.ES6又提供了三种新的方法. includes();返回布尔值,表示是否找到了参数字符串: startsWith();返回布尔值,表示参数字符串是否出现在在源字符串的开头: endWith();返回布尔值,表示参数字符串是否出现在源字符串的结尾. var str = "Hello world!"; str.startsWith("Hello") // true str.en

将dll文件注入到其他进程中的一种新方法

http://www.45it.com/windowszh/201212/33946.htm http://www.hx95.cn/Article/OS/201212/65095.html 我们知道将动态连接库注入到其他进程中有很多种方法.最常见的方法是使用钩子函数(Hook),但是这种方法主要有两个缺点:第一如果某个进程没有加载User32.dll,那么Hook DLL将永远也不会被加载.第二Hook DLL加载的时机问题,只有在进程发出User32调用的时候, Hook DLL才有可能被加载

【HLSDK系列】怎么增加一种新实体

你平常肯定接触到很多比如 info_player_start hostage info_target 之类的实体,这里就解释一下怎么创建一种新的实体. 首先建立一个新的 .h 文件(当然你写在现有的文件上也可以),建立一个基于 CBaseEntity 的类,例如: 1 class CMyEntity : public CBaseEntity 2 { 3 public: 4 void Spawn(void); 5 } 在 .cpp 文件里编写这个类的函数体,例如: 1 void CMyEntity

9种新思想

672. 2011年11月8日 - Lisp语言诞生的时候就包含了9种新思想.其中一些我们今天已经习以为常,另一些则刚刚在其他高级语言中出现,至今还有2种是Lisp独有的. [2016-05-01 15:35:48]673. (8) 代码使用符号和常量组成的树形表示法. [2016-05-01 15:36:21]674. (9) 无论什么时候,整个语言都是可用的. [2016-05-01 15:36:35]675. Lisp语言古怪倒不是因为它的语法很古怪,而是因为它根本没有语法,程序直接以解析