评估紧缩算法时,通常须要思考以下两个关键方面 紧缩比和紧缩/解紧缩吞吐量。
紧缩比
紧缩比是权衡紧缩算法效率的关键目的之一,它示意紧缩后的数据大小与原始数据大小之间的比率。普通来说,紧缩比越高,示意紧缩算法越有效,可以更好地减小数据存储空间或网络传输带宽的占用。
评估紧缩算法的紧缩比时,须要思考以下几点
数据个性
不同类型的数据在紧缩后的成果会有所不同。例如,文本数据、图像数据、音频数据等具备不同的特色,紧缩算法对它们的实用性也不同。
紧缩级别
紧缩算法通常提供多个紧缩级别或参数,可以依据需求选用不同的级别以到达更好的紧缩成果,但通常会就义紧缩/解紧缩速度。
算法复杂度
一些紧缩算法相对便捷,实用于极速紧缩,但紧缩比不如一些更复杂的算法。在实践运行中须要权衡算法的复杂度与紧缩比。
紧缩 / 解紧缩吞吐量
紧缩/解紧缩吞吐量是权衡紧缩算法性能的另一个关键目的,它示意单位期间内紧缩或解紧缩的数据量。关于须要高吞吐量的运行场景(如大规模数据处置、实时数据传输等),紧缩/解紧缩速度是至关关键的。
评估紧缩/解紧缩吞吐量时,须要思考以下几点
算法效率
紧缩/解紧缩算法的成成效率间接影响到吞吐量。一些高效的算法能够在坚持较高紧缩比的同时,成功较高的紧缩/解紧缩速度。
配件允许
某些紧缩算法依赖特定的配件减速或提升,如 SIMD 指令集、GPU 等,这些配件允许可以清楚提高紧缩/解紧缩的吞吐量。
并发性能
紧缩/解紧缩环节能否允许并发处置,以及并发处置的效率如何,关于多线程或散布式系统来说尤为关键。
综合思考紧缩比和紧缩/解紧缩吞吐量两个方面,可以选用最适宜特定运行场景的紧缩算法。有些状况下须要在紧缩比和吞吐量之间做出权衡,依据详细需求选用适宜的算法和参数性能。
紧缩算法的对比
从表中咱们可以发现 zstd 算法有着最高的紧缩比,而在吞吐量上的体现只能说中规中矩。
反观 LZ4 算法,它在吞吐量方面则是毫无不懂的执牛耳者。
GZIP、Snappy、LZ4 甚至是 zstd 的体现各有所长。
但关于 Kafka 而言,它们的性能测试结果却出奇得分歧,即在吞吐量方面:LZ4 > Snappy > zstd 和 GZIP;
而在紧缩比如面,zstd > LZ4 > GZIP > Snappy。假设网络不好且 CPU 资源够的话,倡导经常使用 zstd 紧缩
详细到物理资源,经常使用 Snappy 算法占用的网络带宽最多,zstd 起码,这是正当的,毕竟 zstd 就是要提供超高的紧缩比;
在 CPU 经常使用率方面,各个算法体现得差不多,只是在紧缩时 Snappy 算法经常使用的 CPU 较多一些,而在解紧缩时 GZIP 算规律或许经常使用更多的 CPU。
LZ4(Lempel-Ziv-Markov chain-4)是一种极速紧缩算法,其原理基于Lempel-Ziv紧缩算法,驳回了哈希表和有限形态智能机来成功高效的紧缩和解紧缩环节。
上方是LZ4算法的简明原理
LZ4经常使用字典紧缩的思维,经过构建字典并将重复出现的序列交流为援用字典中的索引来成功紧缩。
字典中存储了之前曾经出现过的序列,可以是延续的字节序列或许婚配的字符串。
LZ4算法经常使用哈希表来极速查找字典中的婚配项。哈希表的键是序列的哈希值,值是该序列在字典中的位置。
假设出现哈希抵触,LZ4经常使用链表来处置抵触,将具备相反哈希值的序列衔接起来。
LZ4经常使用有限形态智能机来查找并示意婚配序列。这个智能机有四个形态,每个形态都对应着一个之前婚配序列的长度(通常是1、4、8或许16个字节)。
在紧缩环节中,LZ4从输入数据中扫描婚配序列,并将婚配序列的起始位置和长度写入输入流。假设找不到婚配序列,LZ4将原始字节间接写入输入流。
在解紧缩环节中,LZ4依据紧缩数据中的援用索引和长度消息,从字典中查找婚配序列,并将婚配序列写入输入流。假设没有婚配序列,LZ4间接将原始字节写入输入流。
总结一下,LZ4算法经过经常使用字典紧缩、哈希表、有限形态智能机等技术,成功了高效的紧缩和解紧缩环节,具备较高的紧缩速度和解紧缩速度,实用于须要极速处置数据的场景。