0717-7821348
彩乐乐网遗漏

彩乐乐网遗漏

您现在的位置: 首页 > 彩乐乐网遗漏
彩乐乐15选5预测-Java 压缩算法哪家强
2019-10-31 22:10:14

本文将会对常用的几个紧缩算法的功能作一下比较。成果表明,某些算法在极点严苛的CPU约束下仍能正常作业。

文中进行比较的算有:

  • JDK GZIP ——这是一个紧缩比高的慢速算法,紧缩后的数据合适长期运用。JDK中的java.util.zip.GZIPInputStream / GZIPOutputStream便是这个算法的完结。
  • JDK deflate ——这是JDK中的又一个算法(zip文件用的便是这一算法)。它与gzip的不同之处在于,你能够指定算法的紧缩等级,这样你能够在紧缩时刻和输出文件巨细上进行平衡。可选的等级有0(不紧缩),以及1(快速紧缩)到9(慢速紧彩乐乐15选5预测-Java 压缩算法哪家强缩)。它的完结是java.util.zip.DeflaterOutputStream / InflaterInputStream。
  • LZ4紧缩算法的Java完结——这是本文介绍的算法中紧缩速度最快的一个,与最快速的deflate比较,它的紧缩的成果要略微差一点。假如想搞清楚它的作业原理,我主张你读一下这篇文章。它是根据友爱的Apache 2.0许可证发布的。
  • Snappy——这是Google开发的一个十分盛行的紧缩算法,它旨在供给速度与紧缩比都相对较优的紧缩算法。我用来测验的是这个完结。它也是遵从Apache 2.0许可证发布的。



紧缩测验

要找出哪些既合适进行数据紧缩测验又存在于大多数Java开发人员的电脑中(我可不期望你为了运转这个测验还得个几百兆的文件)的文件也着实费了我不少时刻。最终我想到,大多数人应该都会在本地装置有JDK的文档。因而我决议将javadoc的目录整个合并成一个文件——拼接一切文件。这个经过tar指令能够很简单完结,但并非一切人都是Linux用户,因而我写了个程序来生成这个文件:

public class InputGenerator { private static final String JAVADOC_PATH = "your_path_to_JDK/docs"; public static final File FILE_PATH = new File( "your_output_file_path" ); static { try { if ( !FILE_PATH.exists() ) makeJavadocFile(); } catch (IOException e) { e.printStackTrace(); } } private static void makeJavadocFile() throws IOException { try( OutputStream os = new BufferedOutputStream( new FileOutputStream( FILE_PATH ), 65536 ) ) { appendDir(os, new File( JAVADOC_PATH )); } System.out.println( "Javadoc file created" ); } private static void appendDir( final OutputStream os, final File root ) throws IOException { for ( File f : root.listFiles() ) { if ( f.isDirectory() ) appendDir( os, f ); else Files.copy(f.toPath(), os); } }}


在我的机器上整个文件的巨细是354,509,602字节(338MB)。


测验

一开始我想把整个文件读进内存里,然后再进行紧缩。不过成果表明这么做的话即便是4G的机器上也很简单把堆内存空间耗尽。

所以我决议运用操作系统的文件缓存。这儿咱们用的测验结构是JMH。这个文件在预热阶段会被操作系统加载到缓存中(在预热阶段会先紧缩两次)。我会将内容紧缩到ByteArrayOutputStream流中(我知道这并不是最快的办法,可是关于各个测验而言它的功能是比较稳定的,而且不需求花费时刻将紧缩后的数据写入到磁盘里),因而还需求一些内存空间来存储这个输出成果。

下面是测验类的基类。一切的测验不同的当地都只在于紧缩的输出流的完结不同,因而能够复用这个测验基类,只需从StreamFactory完结中生成一个流就好了:

@OutputTimeUnit(TimeUnit.MILLISECONDS)@State(Scope.Thread)@Fork(1)@Warmup(iterations = 2)@Measurement(iterations = 3)@BenchmarkMode(Mode.SingleShotTime)public class TestParent { protected Path m_inputFile; @Setup public void setup() { m_inputFile = InputGenerator.FILE_PATH.toPath(); } interface StreamFactory { public OutputStream getStream( final OutputStream underlyingStream ) throws IOException; } public int baseBenchmark( final StreamFactory factory ) throws IOException { try ( ByteArrayOutputStream bos = new ByteArrayOutputStream((int) 彩乐乐15选5预测-Java 压缩算法哪家强m_inputFile.toFile().length()); OutputStream os = factory.getStream( bos ) ) { Files.copy(m_inputFile, os); os.flush(); return bos.size(); } }}



这些测验用例都十分类似(在文末有它们的源代码),这儿只列出了其间的一个比如——JDK deflate的测验类;

public class JdkDeflateTest extends TestParent { @Param({"1", "2", "3", "4", "5", "6", "7", "8", "9"}) public int m_lvl; @Benchmark public int deflate() throws IOException { return bas审计eBenchmark(new StreamFactory() { @Override public OutputStream getStream(OutputStream underlyingStream) throws IOException { final Deflater deflater = new Deflater( m_lvl, true ); return new DeflaterOutputStream( underlyingStream, deflater, 512 ); } }); }}



测验成果

输出文件的巨细

首要咱们来看下输出文件的巨细:

||完结||文件巨细(字节)|| ||GZIP||64,200,201|| ||Snappy (normal)||138,250,196|| ||Snappy (framed)|| 101,470,113|| ||LZ4 (fast)|| 98,316,501|| ||LZ4 (high) ||82,076,909|| ||Deflate (lvl=1) ||78,369,711|| ||Deflate (lvl=2) ||75,261,711|| ||Deflate (lvl=3) ||73,240,781|| ||Deflate (lvl=4) ||68,090,059|| ||Deflate (lvl=5) ||65,699,810|| ||Deflate (lvl=6) ||64,200,191|| ||Deflate (lvl=7) ||64,013,638|| ||Deflate (lvl=8) ||63,845,758|| ||Deflate (lvl=9) ||63,839,200||




能够看出文件的巨细相差悬殊(从60Mb到131Mb)。咱们再来看下不同的紧缩办法需求的时刻是多少。

紧缩时刻

||完结||紧缩时刻(ms)|| ||Snappy.framedOutput ||2264.700|| ||Snappy.normalOutput ||2201.120|| ||Lz4.testFastNative ||1056.326|| ||Lz4.testFastUnsafe ||1346.835|| ||Lz4.testFastSafe ||1917.929|| ||Lz4.testHighNative ||7489.958|| ||Lz4.testHighUnsafe ||10306.973|| ||Lz4.testHighSafe ||14413.622|| ||deflate (lvl=1) ||4522.644|| ||deflate (lvl=2) ||4726.477|| ||deflate (lvl=3) ||5081.934|| ||deflate (lvl=4) ||6739.450|| ||deflate (lvl=5) ||7896.572|| ||deflate (lvl=6) ||9783.701|| ||deflate (lvl=7) ||10731.761|| ||deflate (lvl=8) ||14760.361|| ||deflate (lvl=9) ||14878.364|| ||GZIP ||10351.887||




咱们再将紧缩时刻和文件巨细合并到一个表中来计算下算法的吞吐量,看看能得出什么定论。

吞吐量及功率

||完结||时刻(ms)||未紧缩文件巨细||吞吐量(Mb/秒)||紧缩后文件巨细(Mb)|| ||Snappy.normalOutput ||2201.12 ||338 ||153.5581885586 ||131.8454742432|| ||Snappy.framedOutput ||2264.7 ||338 ||149.2471409017 ||96.7693328857|| ||Lz4.testFastNative ||1056.326 |彩乐乐15选5预测-Java 压缩算法哪家强|338 ||319.9769768045 ||93.7557220459|| ||Lz4.testFastSafe ||1917.929 ||338 ||176.2317583185 ||93.7557220459|| ||Lz4.testFastUnsafe ||1346.835 ||338 ||250.9587291688 ||93.7557220459|| ||Lz4.testHighNative ||7489.958 ||338 ||45.1270888301 ||78.2680511475|| ||Lz4.testHighSafe ||14413.622 ||338 ||23.4500391366 ||78.2680511475|| ||Lz4.testHighUnsafe ||10306.973 ||338 ||32.7933332124 ||78.2680511475|| ||deflate (lvl=1) ||4522.644 ||338 ||74.7350443679 ||74.7394561768|| ||deflate (lvl=2) ||4726.477 ||338 ||71.5120374012 ||71.7735290527|| ||deflate (lvl=3) ||5081.934 ||338 ||66.5101120951 ||69.8471069336|| ||deflate (lvl=4) ||6739.45 ||338 ||50.1524605124 ||64.9452209473|| ||deflate (lvl=5) ||7896.572 ||338 ||42.8033835442 ||62.6564025879|| ||deflate (lvl=6) ||9783.701 ||338 ||34.5472536415 ||61.2258911133|| ||deflate (lvl=7) ||10731.761 ||338 ||31.4952969974 ||61.0446929932|| ||deflate (lvl=8) ||14760.361 ||338 ||22.8991689295 ||60.8825683594|| ||deflate (lvl=9) ||14878.364 ||338 ||22.7175514727 ||60.8730316162|| ||GZIP ||10351.887 ||338 ||32.651051929 ||61.2258911133||


能够看到,其间大多数完结的功率是十分低的:在Xeon E5-2650处理器上,高等级的deflate大约是23Mb/秒,即便是GZIP也就只要33Mb/秒,这大约很难令人满意。一起,最快的defalte算法大约能到75Mb/秒,Snappy是150Mb/秒,而LZ4(快速,JNI完结)能到达难以置信的320Mb/秒!

从表中能够明晰地看出现在有两种完结比较处于下风:Snappy要慢于LZ4(快速紧缩),而且紧缩后的文件要更大。相反,LZ4(高紧缩比)要慢于等级1到4的deflate,而输出文件的巨细即便和等级1的deflate比较也要大上不少。

因而假如需求进行“实时紧缩”的话我必定会在LZ4(快速)的JNI完结或许是等级1的deflate中进行挑选。当然假如你的公司不允许运用第三方库的话你也只能运用deflate了。你还要归纳考虑有多少闲暇的CPU资源以及紧缩后的数据要存储到哪里。比方说,假如你要将紧缩后的数据存储到HDD的话,那么上述100Mb/秒的功能对你而言是毫无协助的(假定你的文件足够大的话)——HDD的速度会成为瓶颈。相同的文件假如输出到SSD硬盘的话——即便是LZ4在它面前也显得太慢了。假如你是要先紧缩数据再发送到网络上的话,最好挑选LZ4,由于deflate75Mb/秒的紧缩功能跟网络125Mb/秒的吞吐量比较真是小巫见大巫了(当然,我知道网络流量还有包头,不过即便算上了它这个距离也是相当可观的)。


总结

假如你以为数据紧缩十分慢的话,能够考虑下LZ4(快速)完结,它进行文本紧缩能到达大约320Mb/秒的速度——这样的紧缩速度对大多数运用而言应该都感知不到。

假如你受限于无法运用第三方库或许只期望有一个略微好一点的紧缩计划的话,能够考虑下运用JDK deflate(lvl=1)进行编解码——相同的文件它的紧缩速度能到达75Mb/秒。


想要紧缩测验源代码的能够私信我获取

私信我:“材料”,还可免费收取更多学习材料