ZipOutputStreamの圧縮レベル毎のサイズと速度を計測

JavaでZipする際に setLevel() で設定した圧縮レベル毎に圧縮後のサイズ、速度を計測しました。
どの圧縮レベル使おうかなーって方は参考までに。

環境

  • JDK17
  • Windows 10 pro

圧縮ファイル

圧縮するファイルは画像数枚、ログファイル(300MB程度が1ファイル)、テキストファイル(86KBが300ファイル弱)

合計で351,954,243バイトとなります。

計測ソース

setLevel()の引数は0(無圧縮)~9(高圧縮率)を設定できるのでそれぞれで計測します。
未設定の場合はデフォルト値で-1となるのでこちらも計測します。
計測は各レベルで10回実施します。

void test() {
    Path path = Paths.get("C:\\圧縮対象");

    for (int i = -1; i < 10; i++) {
        for (int c = 0; c < 10; c++) {
            try (ZipOutputStream zos = new ZipOutputStream(
                    new BufferedOutputStream(new FileOutputStream("C:\\圧縮後\\archive_" + i + ".zip")))) {
                zos.setLevel(i);

                StopWatch sw = new StopWatch();
                sw.start();

                Files.list(path).parallel().forEach(f -> {
                    ZipEntry entry = new ZipEntry(f.getParent().getFileName() + "/" + f.getFileName().toString());
                    try {
                        zos.putNextEntry(entry);
                        zos.write(Files.readAllBytes(f.toAbsolutePath()));
                        zos.closeEntry();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });

                sw.stop();
                System.out.println("setLevel = " + i + ", time:" + sw.getTotalTimeMillis());

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

計測結果

順当に圧縮レベルが上がるごとに時間はかかるがサイズは小さくなっています。
場合によりけりですが使うなら-1(デフォルト)、0(無圧縮)、9(最高圧縮)かなと個人的には思います。
画像ばかりをzipにするなら無圧縮、テキスト等なら-1か9とかそんな感じでしょうか。

level平均値(ms)中央値(ms)サイズ(バイト)
0488.9478.5352,089,041
11323.3131036,681,378
21336.11335.535,182,139
31420.3142133,967,293
42394.92392.531,544,210
52629.42630.529,507,255
63415.93404.529,039,971
73782.6378028,575,744
85778.5576928,138,897
95888.7588328,137,107
-1(default)3406.9338129,039,971

コメント

タイトルとURLをコピーしました