LoginSignup
1
1

いつのまにかZOPFLIのバージョンが新しくなっていた件(ただし4年前)

Last updated at Posted at 2023-08-20

といっても最新版 1.0.3 のリリースは 2019 年 11 月 28 日である。気づくの遅えよと言われても仕方ない。

ZOPFLI とは

ZOPFLI とは deflate,gzip,zlib 互換で高い圧縮率を誇る(代わりに膨大な時間を要する)google 謹製のライブラリである。PNG ファイルも deflate を採用しているし,マイクロソフトオフィスのファイル形式(docx,xlsx, pptx など)は ZIP 形式そのものだ。

バージョン履歴

どうやら,今まで自分が使っていたのは 1.0.1 らしい。

Version Release
1.0.0 2013 年 04 月 25 日
1.0.1 2015 年 08 月 22 日
1.0.2 2018 年 05 月 18 日
1.0.3 2019 年 11 月 28 日

ソースコード比較

ざっくりソースコードを比較してみると,全般的に手を入れているようだ。

ファイルサイズの比較

※内容が同一のセルはグレイで示す

ファイルサイズの比較(単位はバイト)
ファイル名 1.0.1 1.0.3
BLOCKSPLITTER.H 2,818 2,656
BLOCKSPLITTER.C 9,579 9,285
CACHE.H 2,256 2,256
CACHE.C 3,912 3,928
DEFLATE.H 2,932 3,099
DEFLATE.C 29,521 32,950
GZIP_CONTAINER.H 1,402 1,402
GZIP_CONTAINER.C 3,563 6,208
HASH.H 2,309 2,377
HASH.C 3,821 3,958
KATAJAINEN.H 1,497 1,497
KATAJAINEN.C 7,919 7,993
LZ77.H 4,801 5,645
LZ77.C 15,067 20,577
SQUEEZE.H 2,175 2,217
SQUEEZE.C 18,102 18,844
SYMBOLS.H 8,654
TREE.H 1,677 1,677
TREE.C 3,375 3,375
UTIL.H 6,142 5,482
UTIL.C 7,474 1,023
ZLIB_CONTAINER.H 1,402 1,402
ZLIB_CONTAINER.C 2,415 2,415
ZOPFLI.H 2,790 2,536
ZOPFLI_BIN.C 6,319 6,359
ZOPFLI_LIB.C 1,428 1,428

パフォーマンス比較

さっそく最新版のコードを使って自作の BMP ⇒ PNG 変換ツールを再ビルドしてみたが,コンパイル自身は特に問題なく通った。※Visual Studio 2022 を使用

BMP ファイル 7 個(合計 20,295,546 バイト)を PNG ファイルに変換するのに要する時間を測定した。圧縮率は元の BMP ファイルサイズに対する比である。

Version 1.0.1 1.0.3
ファイルサイズ 8,668,599 バイト 8,644,447 バイト
圧縮率 42.7% 42.5%
計算時間 61.0秒 69.0秒

正直言うと高速化を期待したのであるが,圧縮率は少しだけ向上する代わりに計算時間はますます増える結果となった。ちなみにこの時のブロック分割数は 16,繰り返し回数は 15 である。

次にこちらも自作の ZIP 形式ファイルの再圧縮ツールを再ビルドして,マイクロソフトオフィスのファイル(EXCELファイル,2,460,374バイト)の再圧縮を試みた。ZOPFLI にはブロック分割数と繰り返し回数の2つの調整パラメータがある。繰り返し回数は圧縮を試行する回数であり,多ければ多いほど圧縮率は高くなる。ブロック分割数も同様に多くすれば多くするほど圧縮率は高くなるが,特別に 0 は無制限という意味になる。

最新版の 1.0.3 は全ての条件において 1.0.1 よりも圧縮率が高くなっている。計算時間と圧縮率のトレードオフを考えると,むやみに繰り返し回数を増やすよりはブロック分割数を増やしたほうが良いようだが,この辺りはデータによっても変わるだろう。

ちなみに ZLIB を用いた場合の圧縮率 83.09%,計算時間は 2 秒である。※最大圧縮レベル 9 のとき

いや,もう ZLIB でいいんじゃね?と思うと同時にマイクロソフト EXCEL はスピード重視のためか圧縮率は低いようだ。圧縮レベル 1 くらいか?

計算時間と圧縮率のトレードオフ
ブロック
分割数
繰り返し
回数
1.0.1 1.0.3
圧縮率 時間 圧縮率 時間
16 5 80.00% 75秒 79.97% 106秒
15 79.80% 109秒 79.75% 136秒
50 79.72% 223秒 79.66% 247秒
0 5 79.64% 111秒 79.55% 203秒
15 79.48% 157秒 79.36% 250秒
50 79.34% 337秒 79.21% 412秒

$○$ バージョン 1.0.1,ブロック分割数 16 のとき
$●$ バージョン 1.0.1,ブロック分割数 0 のとき
$◇$ バージョン 1.0.3,ブロック分割数 16 のとき
$◆$ バージョン 1.0.3,ブロック分割数 0 のとき

※マーカのラベルは(ブロック分割数,繰り返し回数)という意味

計算時間と圧縮率のトレードオフ

おまけ

自作の ZIP ファイルの再圧縮ツール,PNG ファイルの再圧縮ツールについても公開しようと思ったが,同じようなことを考える先人は必ずいるものだ。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1