閱讀358 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go NFS搭建過程
  下一篇:go Ubuntu中Eclipse按鈕失效解決方法