圧縮ツールのパフォーマンスを測ってみた


「ネットワークが遅くて、数百 MB のファイルを送るのにかなり時間かかるんですよねぇ」という話を聞いたので、使っているツールを聞くと gzip だというので、bzip2 や xz を使うといいかもしれない、というふうに答えました。あとになって実際のところどうなのかと思ったので、実際にいくつかのパターンで圧縮、伸張にかかる時間と圧縮率を測ってみました。

用意したのは 20MB, 107MB, 1.1GB の3種類のファイルで、すべてプレインテキストですが、内容はバラバラです。使ったツールは gzip, bzip2, xz です。

圧縮時間 (sec.)
20 MiB 107 MiB 1.1 GiB
gzip (default) 0.67 1.02 24.16
gzip (best) 4.93 3.44 63.20
bzip2 1.73 7.43 270.56
xz 8.18 11.85 346.63

どの組み合わせでもデフォルトレベルの gzip が一番早く、xz が一番時間がかかっています。
次に圧縮率を見てみます。ここでは元のファイルサイズから圧縮によってどの程度ファイルサイズが減少したかを圧縮率としています。圧縮率の右側の数字は圧縮後のファイルサイズです。

圧縮率
20 MiB (20,482,194) 107 MiB (111,778,071) 1.1 GiB (1,180,352,167)
gzip (default) 77.1% 4,681,476 95.7% 4,805,223 89.5% 124,224,786
gzip (best) 79.4% 4,212,965 95.8% 4,748,784 89.6% 122,421,774
bzip2 90.7% 1,912,758 96.1% 4,379,552 92.8% 84,921,781
xz 94.3% 1,160,628 97.6% 2,660,448 97.9% 24,357,044

xz の圧縮率の高さが目立ちますね。またファイルによらず他のものと比べると圧縮率が安定しています。残念ながら gzip は圧縮率をあげてもあまり効果はみられません。

伸張時間 (sec.)
20 MiB 107 MiB 1.1 GiB
gzip (default) 0.122 0.421 5.771
gzip (best) 0.119 0.424 5.753
bzip2 0.440 1.033 27.478
xz 0.107 0.457 5.604

圧縮とは異なり xz が gzip と同等のパフォーマンスです。つまり xzgrep などは zgrep などと同等のパフォーマンスが期待できるということを意味します。

この結果から判断するに gzip は圧縮率を上げずにデフォルトで使うのが良い感じです。gzip の使いどころとしては圧縮率はそこそこで圧縮と伸張の速度が重要なときが良さそうです。
bzip2 は圧縮速度を多少犠牲にしても圧縮率が欲しい時に使うのが良さそうです。圧縮したらあまり伸張することのない DB のダンプファイルなどに向いているかもしれません。
xz は圧縮速度よりも圧縮率と伸張の速度が重要なときに使うのが良さそうです。使いどころとしては後から grep や less などで閲覧することが多く、ファイルサイズの大きいログファイルなどでしょうか。成果物を配布するときにも良いですね。

まだあまりメジャーではない xz ですが、使いどころは多そうです。ちなみに tar も xz をサポートしています。以下のようにして使います。

tar Jcf foo.tar.xz foo

適材適所で圧縮アルゴリズムを使い分けるといいですね。


This entry was posted in 技術. Bookmark the permalink.