Java壓縮類庫的使用-5.性能檢測
inkfish原創,請勿商業性質轉載,轉載請注明來源(https://blog.csdn.net/inkfish )。
在選擇壓縮、打包算法的時候,不僅僅要選擇算法,還需要選擇用哪個實現類庫,不同的實現類庫實現效率不同,默認壓縮比率不同。為了測試JDK、Ant、commons-compress在默認情況下的效率,設計了如下程序:(來源:https://blog.csdn.net/inkfish)
100M大小隨機字符串文件生成程序:(來源:https://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)。(來源:https://blog.csdn.net/inkfish)
性能測試程序:(來源:https://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; } }
測試環境:(來源:https://blog.csdn.net/inkfish)
硬件:Dell Latitude E6400(Intel Core2 Duo P8600、2G內存、7200轉高速硬盤)(來源:https://blog.csdn.net/inkfish)
軟件:Windows XP SP3(來源:https://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(來源:https://blog.csdn.net/inkfish)
原始測試結果:(來源:https://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毫秒
整理後測試結果:(來源:https://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 |
結論:(來源:https://blog.csdn.net/inkfish)
1.在各自默認壓縮率下,commons-compress包中zip算法具有較快的壓縮速度,ant包中tar具有較快的打包速度;(來源:https://blog.csdn.net/inkfish)
2.commons-compress中的gzip壓縮速度遠遠慢於jdk中的gzip,雖然壓縮率比jdk高;(來源:https://blog.csdn.net/inkfish)
3.ant包中bzip2因為壓縮正確性有問題,得到的數據不具有可比性。(來源:https://blog.csdn.net/inkfish)
4.由於被壓縮文件內容由程序自動隨機生成,在應用的具體環境中,壓縮率、壓縮時間肯定有所不同。這裏提供的源碼特別是測試程序經修改能夠針對具體文件進行測試,可以稍微彌補一些不足。(來源:https://blog.csdn.net/inkfish)
5.因為測試目的原因,不對壓縮率進行評價。5(來源:https://blog.csdn.net/inkfish)
最後更新:2017-04-02 04:01:44