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)

目录
相关文章
|
2月前
|
Kubernetes Cloud Native Java
云原生之旅:从容器到微服务的演进之路Java 内存管理:垃圾收集器与性能调优
【8月更文挑战第30天】在数字化时代的浪潮中,企业如何乘风破浪?云原生技术提供了一个强有力的桨。本文将带你从容器技术的基石出发,探索微服务架构的奥秘,最终实现在云端自由翱翔的梦想。我们将一起见证代码如何转化为业务的翅膀,让你的应用在云海中高飞。
|
19天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
174 37
|
13天前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
|
3天前
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
15 2
|
12天前
|
监控 算法 Java
深入理解Java中的垃圾回收机制在Java编程中,垃圾回收(Garbage Collection, GC)是一个核心概念,它自动管理内存,帮助开发者避免内存泄漏和溢出问题。本文将探讨Java中的垃圾回收机制,包括其基本原理、不同类型的垃圾收集器以及如何调优垃圾回收性能。通过深入浅出的方式,让读者对Java的垃圾回收有一个全面的认识。
本文详细介绍了Java中的垃圾回收机制,从基本原理到不同类型垃圾收集器的工作原理,再到实际调优策略。通过通俗易懂的语言和条理清晰的解释,帮助读者更好地理解和应用Java的垃圾回收技术,从而编写出更高效、稳定的Java应用程序。
|
26天前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
49 11
|
28天前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
45 11
|
26天前
|
算法 Java
Java 压缩文件
在Java中压缩文件是一个常见的需求,通常可以通过使用Java自带的`java.util.zip`包来实现。这个包提供了`ZipOutputStream`类来创建ZIP格式的压缩文件。以下是一个简单的示例,展示了如何将多个文件压缩到一个ZIP文件中。 ### 示例:将多个文件压缩到一个ZIP文件中 ```java import java.io.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class ZipFilesExample { public static vo
|
1月前
|
缓存 监控 安全
如何提高 Java 高并发程序的性能?
以下是提升Java高并发程序性能的方法:优化线程池设置,减少锁竞争,使用读写锁和无锁数据结构。利用缓存减少重复计算和数据库查询,并优化数据库操作,采用连接池和分库分表策略。应用异步处理,选择合适的数据结构如`ConcurrentHashMap`。复用对象和资源,使用工具监控性能并定期审查代码,遵循良好编程规范。
|
2月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
25 1
下一篇
无影云桌面