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)

目录
相关文章
|
16天前
|
Java Spring
如何优化Java异步任务的性能?
本文介绍了Java中四种异步任务实现方式:基础Thread、线程池、CompletableFuture及虚拟线程。涵盖多场景代码示例,展示从简单异步到复杂流程编排的演进,适用于不同版本与业务需求,助你掌握高效并发编程实践。(239字)
125 6
|
1月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
108 3
|
2月前
|
机器学习/深度学习 Java 编译器
解锁硬件潜能:Java向量化计算,性能飙升W倍!
编译优化中的机器相关优化主要包括指令选择、寄存器分配、窥孔优化等,发生在编译后端,需考虑目标平台的指令集、寄存器、SIMD支持等硬件特性。向量化计算利用SIMD技术,实现数据级并行,大幅提升性能,尤其适用于图像处理、机器学习等领域。Java通过自动向量化和显式向量API(JDK 22标准)支持该技术。
87 4
|
2月前
|
Cloud Native 前端开发 Java
WebAssembly 与 Java 结合的跨语言协作方案及性能提升策略研究
本文深入探讨了WebAssembly与Java的结合方式,介绍了编译Java为Wasm模块、在Java中运行Wasm、云原生集成等技术方案,并通过金融分析系统的应用实例展示了其高性能、低延迟、跨平台等优势。结合TeaVM、JWebAssembly、GraalVM、Wasmer Java等工具,帮助开发者提升应用性能与开发效率,适用于Web前端、服务器端及边缘计算等场景。
97 0
|
3月前
|
存储 分布式计算 算法
Java 大视界 -- Java 大数据在智能教育在线考试监考与作弊检测中的技术创新(193)
本文探讨了Java大数据技术在智能教育在线考试监考与作弊检测中的创新应用。随着在线考试的普及,作弊问题日益突出,传统监考方式难以应对。通过Java大数据技术,可实现考生行为分析、图像识别等多维度监控,提升作弊检测的准确性与效率。结合Hadoop与Spark等技术,系统能实时处理海量数据,构建智能监考体系,保障考试公平性,推动教育评价体系的数字化转型。
|
4月前
|
存储 Java 大数据
Java代码优化:for、foreach、stream使用法则与性能比较
总结起来,for、foreach和stream各自都有其适用性和优势,在面对不同的情况时,有意识的选择更合适的工具,能帮助我们更好的解决问题。记住,没有哪个方法在所有情况下都是最优的,关键在于理解它们各自的特性和适用场景。
411 23
|
5月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
8月前
|
人工智能 Java 数据处理
Java高级应用开发:基于AI的微服务架构优化与性能调优
在现代企业级应用开发中,微服务架构虽带来灵活性和可扩展性,但也增加了系统复杂性和性能瓶颈。本文探讨如何利用AI技术,特别是像DeepSeek这样的智能工具,优化Java微服务架构。AI通过智能分析系统运行数据,自动识别并解决性能瓶颈,优化服务拆分、通信方式及资源管理,实现高效性能调优,助力开发者设计更合理的微服务架构,迎接未来智能化开发的新时代。
|
11月前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
197 5
|
11月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
175 6

热门文章

最新文章