Java压缩类库的使用-5.性能检测

简介:

  inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish )。

  在选择压缩、打包算法的时候,不仅仅要选择算法,还需要选择用哪个实现类库,不同的实现类库实现效率不同,默认压缩比率不同。为了测试JDK、Ant、commons-compress在默认情况下的效率,设计了如下程序:(来源:http://blog.csdn.net/inkfish)

 

100M大小随机字符串文件生成程序:(来源:http://blog.csdn.net/inkfish)

package study.inkfish.compress; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.RandomStringUtils; public class CharFileGener { public static void main(String[] args) throws IOException { charGener(); } private static void charGener() throws IOException { Writer writer = new BufferedWriter(new FileWriter(new File("D:/TestCompress/txt.txt")), 1024 * 1024 * 5); int max = 1024 * 1024; String strs = "`1234567890-=~!@#$%^&*()_+qwertyuiop[]//QWERTYUIOP{}|asdfghjkl;'/":LKJHGFDSAzxcvbnm,./?><MNBVCXZ"; for (int i = 0; i < max; i++) { writer.write(RandomStringUtils.random(99, strs)); writer.write("/n"); } IOUtils.closeQuietly(writer); } }

上面的代码用于生成随机的半角字符组成的文本文件,大小为100M(1024*1024*100byte)。(来源:http://blog.csdn.net/inkfish)

性能测试程序:(来源:http://blog.csdn.net/inkfish)

package study.inkfish.compress; import java.io.File; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; public class TestCompress { public static void main(String[] args) throws IOException { File srcFile = new File("D:/TestCompress", "text.txt"); for (int i = 0; i < 3; i++) {//循环测试三遍 doTest(srcFile); cleanDir(srcFile); } } private static void cleanDir(File srcFile) throws IOException { FileUtils.deleteDirectory(new File(srcFile.getParentFile(), "jdk")); FileUtils.deleteDirectory(new File(srcFile.getParentFile(), "ant")); FileUtils.deleteDirectory(new File(srcFile.getParentFile(), "commons")); } /**测试某类库某一压缩/打包算法的压缩/打包、解压/解包*/ private static void doTest(Compress comp, File srcFile, File destFile) { try { long start = System.nanoTime(); comp.compress(srcFile, destFile); long compressTime = System.nanoTime() - start; System.out.printf("%20s,原始文件大小:%7.3fM,压缩后文件大小:%7.3fM,压缩耗时:%9.2f毫秒", comp.getClass() .getSimpleName(), toMSize(srcFile.length()), toMSize(destFile.length()), toMilliSec(compressTime)); try { start = System.nanoTime(); comp.decompress(destFile, destFile.getParentFile()); long decompressTime = System.nanoTime() - start; System.out.printf(",解压缩耗时:%9.2f毫秒,总耗时:%9.2f毫秒/n", toMilliSec(decompressTime), toMilliSec(compressTime + decompressTime)); } catch (Throwable t) { t.printStackTrace(); } } catch (Throwable t) { t.printStackTrace(); } } private static void doTest(File srcFile) { String path = srcFile.getParent(); String srcFileStr = srcFile.getName(); System.out.println("/n源文件:" + srcFile.toString()); System.out.println("/n" + StringUtils.center("压缩测试", 120, '=')); doTest(new JdkZLIBCompress(), srcFile, new File(path, "jdk/zlib/" + srcFileStr + ".zlib")); doTest(new JdkGZIPCompress(), srcFile, new File(path, "jdk/gz/" + srcFileStr + ".gz")); doTest(new CommonsGZIPCompress(), srcFile, new File(path, "commons/gzip/" + srcFileStr + ".gz")); doTest(new AntBzip2Compress(), srcFile, new File(path, "ant/bzip2/" + srcFileStr + ".bz2")); doTest(new CommonsBZip2Compress(), srcFile, new File(path, "commons/bzip2/" + srcFileStr + ".bz2")); doTest(new JdkZipCompress(), srcFile, new File(path, "jdk/zip/" + srcFileStr + ".zip")); doTest(new AntZipCompress(), srcFile, new File(path, "ant/zip/" + srcFileStr + ".zip")); doTest(new CommonsZipCompress(), srcFile, new File(path, "commons/zip/" + srcFileStr + ".zip")); System.out.println("/n" + StringUtils.center("打包测试", 120, '=')); doTest(new AntTarCompress(), srcFile, new File(path, "ant/tar/" + srcFileStr + ".tar")); doTest(new CommonsTarCompress(), srcFile, new File(path, "commons/tar/" + srcFileStr + ".tar")); doTest(new CommonsArCompress(), srcFile, new File(path, "commons/ar/" + srcFileStr + ".ar")); doTest(new CommonsCPIOCompress(), srcFile, new File(path, "commons/cipo/" + srcFileStr + ".cipo")); } /** 纳秒转毫秒 */ private static float toMilliSec(long interval) { return interval / 1000F / 1000F; } /** Byte转MByte */ private static float toMSize(long size) { return size / 1024F / 1024F; } }

测试环境:(来源:http://blog.csdn.net/inkfish)

硬件:Dell Latitude E6400(Intel Core2 Duo P8600、2G内存、7200转高速硬盘)(来源:http://blog.csdn.net/inkfish)

软件:Windows XP SP3(来源:http://blog.csdn.net/inkfish)

类库:JDK 1.6.0_11、Ant 1.7.0、commons-compress 1.0、commons-io 1.4、commons-lang 2.4(来源:http://blog.csdn.net/inkfish)

原始测试结果:(来源:http://blog.csdn.net/inkfish)

源文件:D:/TestCompress/text.txt ==========================================================压缩测试========================================================== JdkZLIBCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 14164.39毫秒,解压缩耗时: 6468.35毫秒,总耗时: 20632.74毫秒 JdkGZIPCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10681.97毫秒,解压缩耗时: 6824.98毫秒,总耗时: 17506.95毫秒 CommonsGZIPCompress,原始文件大小:100.000M,压缩后文件大小: 82.999M,压缩耗时: 35713.27毫秒,解压缩耗时: 28766.85毫秒,总耗时: 64480.12毫秒 AntBzip2Compress,原始文件大小:100.000M,压缩后文件大小: 82.999M,压缩耗时: 35838.90毫秒,解压缩耗时: 28093.38毫秒,总耗时: 63932.28毫秒 CommonsBZip2Compress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时:113749.55毫秒,解压缩耗时:104879.45毫秒,总耗时:218628.98毫秒 JdkZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10624.03毫秒,解压缩耗时: 6529.68毫秒,总耗时: 17153.71毫秒 AntZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10579.43毫秒,解压缩耗时: 10021.43毫秒,总耗时: 20600.86毫秒 CommonsZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10323.45毫秒,解压缩耗时: 6798.18毫秒,总耗时: 17121.63毫秒 ==========================================================打包测试========================================================== AntTarCompress,原始文件大小:100.000M,压缩后文件大小:100.010M,压缩耗时: 6464.60毫秒,解压缩耗时: 3999.30毫秒,总耗时: 10463.90毫秒 CommonsTarCompress,原始文件大小:100.000M,压缩后文件大小:100.010M,压缩耗时: 5286.30毫秒,解压缩耗时: 6248.18毫秒,总耗时: 11534.47毫秒 CommonsArCompress,原始文件大小:100.000M,压缩后文件大小:100.000M,压缩耗时: 5986.99毫秒,解压缩耗时: 5614.21毫秒,总耗时: 11601.19毫秒 CommonsCPIOCompress,原始文件大小:100.000M,压缩后文件大小:100.000M,压缩耗时: 6812.78毫秒,解压缩耗时: 5749.83毫秒,总耗时: 12562.61毫秒   源文件:D:/TestCompress/text.txt ==========================================================压缩测试========================================================== JdkZLIBCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10820.10毫秒,解压缩耗时: 6837.67毫秒,总耗时: 17657.77毫秒 JdkGZIPCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10742.54毫秒,解压缩耗时: 6471.39毫秒,总耗时: 17213.93毫秒 CommonsGZIPCompress,原始文件大小:100.000M,压缩后文件大小: 82.999M,压缩耗时: 35621.16毫秒,解压缩耗时: 27691.03毫秒,总耗时: 63312.19毫秒 AntBzip2Compress,原始文件大小:100.000M,压缩后文件大小: 82.999M,压缩耗时: 35927.41毫秒,解压缩耗时: 27545.73毫秒,总耗时: 63473.14毫秒 CommonsBZip2Compress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时:113363.30毫秒,解压缩耗时:105609.01毫秒,总耗时:218972.30毫秒 JdkZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10558.16毫秒,解压缩耗时: 6784.21毫秒,总耗时: 17342.37毫秒 AntZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10506.37毫秒,解压缩耗时: 10327.44毫秒,总耗时: 20833.80毫秒 CommonsZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10399.44毫秒,解压缩耗时: 6876.46毫秒,总耗时: 17275.90毫秒 ==========================================================打包测试========================================================== AntTarCompress,原始文件大小:100.000M,压缩后文件大小:100.010M,压缩耗时: 6107.04毫秒,解压缩耗时: 4393.18毫秒,总耗时: 10500.21毫秒 CommonsTarCompress,原始文件大小:100.000M,压缩后文件大小:100.010M,压缩耗时: 5782.27毫秒,解压缩耗时: 5303.96毫秒,总耗时: 11086.22毫秒 CommonsArCompress,原始文件大小:100.000M,压缩后文件大小:100.000M,压缩耗时: 5771.36毫秒,解压缩耗时: 5549.45毫秒,总耗时: 11320.82毫秒 CommonsCPIOCompress,原始文件大小:100.000M,压缩后文件大小:100.000M,压缩耗时: 6944.52毫秒,解压缩耗时: 6227.69毫秒,总耗时: 13172.21毫秒   源文件:D:/TestCompress/text.txt ==========================================================压缩测试========================================================== JdkZLIBCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10738.53毫秒,解压缩耗时: 8055.89毫秒,总耗时: 18794.42毫秒 JdkGZIPCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10766.80毫秒,解压缩耗时: 6851.34毫秒,总耗时: 17618.14毫秒 CommonsGZIPCompress,原始文件大小:100.000M,压缩后文件大小: 82.999M,压缩耗时: 35744.91毫秒,解压缩耗时: 27782.01毫秒,总耗时: 63526.93毫秒 AntBzip2Compress,原始文件大小:100.000M,压缩后文件大小: 82.999M,压缩耗时: 35688.23毫秒,解压缩耗时: 27674.49毫秒,总耗时: 63362.73毫秒 CommonsBZip2Compress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时:114151.34毫秒,解压缩耗时:103659.39毫秒,总耗时:217810.73毫秒 JdkZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10754.72毫秒,解压缩耗时: 6681.37毫秒,总耗时: 17436.09毫秒 AntZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10437.32毫秒,解压缩耗时: 10181.76毫秒,总耗时: 20619.08毫秒 CommonsZipCompress,原始文件大小:100.000M,压缩后文件大小: 83.213M,压缩耗时: 10631.77毫秒,解压缩耗时: 6132.21毫秒,总耗时: 16763.98毫秒 ==========================================================打包测试========================================================== AntTarCompress,原始文件大小:100.000M,压缩后文件大小:100.010M,压缩耗时: 4665.05毫秒,解压缩耗时: 4996.47毫秒,总耗时: 9661.53毫秒 CommonsTarCompress,原始文件大小:100.000M,压缩后文件大小:100.010M,压缩耗时: 5434.97毫秒,解压缩耗时: 5869.99毫秒,总耗时: 11304.96毫秒 CommonsArCompress,原始文件大小:100.000M,压缩后文件大小:100.000M,压缩耗时: 6556.45毫秒,解压缩耗时: 6196.02毫秒,总耗时: 12752.47毫秒 CommonsCPIOCompress,原始文件大小:100.000M,压缩后文件大小:100.000M,压缩耗时: 6152.87毫秒,解压缩耗时: 7070.35毫秒,总耗时: 13223.22毫秒

整理后测试结果:(来源:http://blog.csdn.net/inkfish)

实现类 原始文件大小 压缩后文件大小 压缩耗平均时 解压缩平均耗时 平均总耗时
CommonsZipCompress 100 83.213 10451.55 6602.28 17053.84
JdkZipCompress 100 83.213 10645.64 6665.09 17310.72
JdkGZIPCompress 100 83.213 10730.44 6715.90 17446.34
JdkZLIBCompress 100 83.213 11907.67 7120.64 19028.31
AntZipCompress 100 83.213 10507.71 10176.88 20684.58
AntBzip2Compress 100 82.999 35818.18 27771.20 63589.38
CommonsGZIPCompress 100 82.999 35693.11 28079.96 63773.08
CommonsBZip2Compress 100 83.213 113754.73 104715.95 218470.67
 
实现类 原始文件大小 压包后文件大小 打包耗平均时 解包平均耗时 平均总耗时
AntTarCompress 100 100.010 5745.56 4462.98 10208.55
CommonsTarCompress 100 100.010 5501.18 5807.38 11308.55
CommonsArCompress 100 100.000 6104.93 5786.56 11891.49
CommonsCPIOCompress 100 100.000 6636.72 6349.29 12986.01

结论:(来源:http://blog.csdn.net/inkfish)

1.在各自默认压缩率下,commons-compress包中zip算法具有较快的压缩速度,ant包中tar具有较快的打包速度;(来源:http://blog.csdn.net/inkfish)

2.commons-compress中的gzip压缩速度远远慢于jdk中的gzip,虽然压缩率比jdk高;(来源:http://blog.csdn.net/inkfish)

3.ant包中bzip2因为压缩正确性有问题,得到的数据不具有可比性。(来源:http://blog.csdn.net/inkfish)

4.由于被压缩文件内容由程序自动随机生成,在应用的具体环境中,压缩率、压缩时间肯定有所不同。这里提供的源码特别是测试程序经修改能够针对具体文件进行测试,可以稍微弥补一些不足。(来源:http://blog.csdn.net/inkfish)

5.因为测试目的原因,不对压缩率进行评价。5(来源:http://blog.csdn.net/inkfish)

目录
相关文章
|
4天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
17 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
7天前
|
存储 安全 算法
【JAVA】HashMap扩容性能影响及优化策略
【JAVA】HashMap扩容性能影响及优化策略
|
2天前
|
网络协议 Java
Java中如何使用Socket类检测端口是否存在
Java中如何使用Socket类检测端口是否存在
17 4
|
2天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
13 3
|
3天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【5月更文挑战第1天】 在移动开发的世界中,性能优化始终是开发者关注的焦点。随着Kotlin的兴起,许多团队和开发者面临着一个选择:是坚持传统的Java语言,还是转向现代化、更加简洁的Kotlin?本文通过深入分析和对比Kotlin与Java在Android应用开发中的性能表现,揭示两者在编译效率、运行速度和内存消耗等方面的差异。我们将探讨如何根据项目需求和团队熟悉度,选择最适合的语言,以确保应用的高性能和流畅体验。
|
4天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第30天】在Android开发领域,Kotlin作为一种现代化的编程语言,因其简洁性和功能性受到了开发者的广泛欢迎。尽管与传统的Java相比,Kotlin提供了诸多便利,但关于其性能表现的讨论始终未息。本文将深入分析Kotlin和Java在Android平台上的性能差异,通过实际测试数据揭示两种语言在编译效率、运行速度以及内存占用方面的具体表现,并探讨如何利用Kotlin的优势来提升Android应用的整体性能。
|
7天前
|
Java 大数据 Go
Go vs Java:在大数据处理领域的性能对比
Go与Java在大数据处理中各有特点。Go启动快,内存占用少,静态类型及并发模型(goroutine和channel)使其在并发性能上有优势。Java虽然启动慢,JVM内存占用高,但拥有丰富的生态系统和并发工具。代码示例展示了Go的goroutine和Java的线程池处理大数据的场景。在性能上,Go可能更优,但Java的跨平台性和生态广度使其仍被广泛应用。
|
8天前
|
Java 测试技术 Android开发
构建高效Android应用:探究Kotlin与Java的性能对比
【4月更文挑战第26天】 在移动开发领域,性能优化一直是开发者追求的重要目标。随着Kotlin的兴起,其在Android平台上的应用逐渐增多,但关于Kotlin与Java在性能方面的对比,社区中仍存在诸多讨论。本文通过实际的性能测试,分析比较了使用Kotlin和Java编写的Android应用在多个维度上的运行效率,旨在为开发者提供一个明确的性能参考,帮助他们在选择编程语言时做出更加明智的决策。
|
10天前
|
Java 编译器 Android开发
构建高效Android应用:Kotlin与Java的性能比较
【4月更文挑战第25天】 在移动开发领域,性能优化始终是开发者关注的焦点。随着Kotlin的普及,许多Android开发者开始考虑是否应该采用这种新的编程语言来替代传统的Java。本文通过对Kotlin和Java进行深入的性能比较,揭示了两者在Android开发中的效率差异,并提供了选择合适语言以提升应用性能的策略。通过实际案例分析和基准测试,我们探讨了两种语言在编译速度、运行时性能以及内存消耗等方面的表现,旨在为开发者提供一个关于如何在Android项目中做出明智语言选择的指南。
17 0
|
10天前
|
缓存 监控 Java
Java从入门到精通:3.3.1性能优化与调优——学习Java的性能优化技巧,如JVM调优
Java从入门到精通:3.3.1性能优化与调优——学习Java的性能优化技巧,如JVM调优