zlib, libbzip2, XZ Utils の比較

概要

zlib, libbzip2, XZ Utils に関するドキュメントを作成したので,各ライブラリによる圧縮・復元について,圧縮率,圧縮時間,復元時間を比較してみました.圧縮率は((圧縮後のサイズ)÷(圧縮前のサイズ))になっています.

実験設定

実験に用いた環境は,Amazon EC2 のハイ CPU ミディアム インスタンスです.インスタンスの詳細については,Amazon AWS のサイト(Amazon EC2(安全でスケーラブルなクラウド上の仮想サーバー)| AWS)をご確認ください.OS は Ubuntu 10.04 で,比較に用いたライブラリのバージョンは以下の通りです.

  • ライブラリのバージョン
    • zlib: 1.2.3.3
    • libbzip2: 1.0.5, 10-Dec-2007
    • XZ Utils: 4.999.9beta

比較した形式は gzip, bzip2, xz の 3 種類です.実験には lzma 形式も加えていたのですが,XZ Utils により作成される lzma 形式のデータは lzma コマンドにより作成されるデータとは異なることが分かり,取り除くことにしました.lzma から xz へと移行するように推奨されているので,あまり問題はないと思います.

※ 実のところ,復元については xz より lzma の方が高速になります.xz はデフォルトの設定で CRC64 による整合性の確認が有効になるのに対し,lzma には整合性を確認する機能自体が存在しないことが原因だと思います.

比較においては,圧縮レベルやブロックサイズを切り替えつつ,圧縮率,圧縮時間,復元時間を計測しました.各形式に対して試した設定は以下の通りです.

  • 各形式の設定
    • gzip: 圧縮レベル 1 〜 9
    • bzip2: ブロックサイズ 1 〜 9
    • xz: 圧縮レベル 0 〜 9, LZMA_PRESET_EXTREME フラグ ON/OFF
      • LZMA_PRESET_EXTREME フラグはコマンドの -e, --extreme オプションと対応します.

比較に用いたデータは,UTF-8 エンコードされた日本語のテキスト,HTML アーカイブMeCab の出力をそれぞれ 100MiB と,Linux Kernel 2.6.36 のアーカイブThe Linux Kernel Archives,約 400MiB)です.

実験結果(圧縮率)

計測した圧縮率をグラフにしました.X 軸が圧縮レベル・ブロックサイズ,Y 軸が圧縮率(%)に対応しています.gzip には圧縮レベル 0 が存在せず,bzip2 にはブロックサイズ 0 が存在しないことに注意してください.

全体的に,gzip より bzip2 の方が優れた圧縮率を示し,bzip2 より xz の方が少し優れた圧縮率を示しています.圧縮率で選ぶなら xz と考えても問題ないと思います.

xz の -e オプションについては,低い圧縮レベルと併せた場合に効果が大きいようです.メモリの消費を抑えたい状況では効果的です.また,HTML アーカイブMeCab の出力など,圧縮しやすいデータについては,圧縮レベルが高くても,目に見えるくらいの効果が確認できます.

Compression Ratio (%) - 100MiB Text Archive

Compression Ratio (%) - 100MiB HTML Archive

Compression Ratio (%) - 100MiB MeCab Output

Compression Ratio (%) - 400MiB Linux Kernel Archive

実験結果(圧縮時間)

計測した圧縮率をグラフにしました.X 軸が圧縮レベル・ブロックサイズ,Y 軸が圧縮時間(秒)に対応しています.gzip には圧縮レベル 0 が存在せず,bzip2 にはブロックサイズ 0 が存在しないことに注意してください.

グラフがオレンジになりました.原因は,-e オプションを付けた xz による圧縮がとても遅いからです.gzip や bzip2 と比べると,驚くほどに時間がかかっています.メモリ消費が増えないところは魅力的ですが,使いどころには困るかもしれません.

残る gzip, bzip2, xz の中では,gzip が明らかに高速です.次点で圧縮レベルの低い xz,続いて bzip2,最後に圧縮レベルの高い xz という順序になっています.速さで選ぶなら gzip でしょう.

圧縮レベルの高い xz は圧縮率において優れていますが,圧縮時間は gzip の 10 倍以上という驚愕の事実が示されました.xz の用途としては,長期保存や配布を目的としてサイズの大きなアーカイブを圧縮するという使い方が有力です.bzip2 を置き換える存在になるかもしれません.

Compression Time (s) - 100MiB Text Archive

Compression Time (s) - 100MiB HTML Archive

Compression Time (s) - 100MiB MeCab Output

Compression Time (s) - 400MiB Linux Kernel Archive

実験結果(復元時間)

計測した圧縮率をグラフにしました.X 軸が圧縮レベル・ブロックサイズ,Y 軸が復元時間(秒)に対応しています.gzip には圧縮レベル 0 が存在せず,bzip2 にはブロックサイズ 0 が存在しないことに注意してください.

圧縮時間ほどの差はありませんが,復元時間においても gzip が最も速いという結果になりました.最も時間がかかっているのは bzip2 です.xz の方が圧縮率・復元時間ともに優れているので,大きなデータの配布には xz という選択肢は間違っていないと思います.ただし,xz の知名度がそれほど高くないことと,xz 単体の普及率が低いことには注意が必要です.

bzip2 の復元時間は,ブロックサイズの影響をあまり受けていません.一方,gzip と xz については,圧縮レベルが高いほど復元時関が短くなっています.圧縮率が良くなるほど復元時間が短くなるらしく,gzip と xz による圧縮率の差が大きくなる状況では,xz の復元時間は gzip の 5 割増しに収まっています.他のデータについては 3 〜 4 倍くらいです.

Decompression Time (s) - 100MiB Text Archive

Decompression Time (s) - 100MiB HTML Archive

Decompression Time (s) - 100MiB MeCab Output

Decompression Time (s) - 400MiB Linux Kernel Archive

実験結果の詳細(圧縮率)

グラフの元になっている表です.上端の行は圧縮レベルを示しています.

テキストアーカイブ(100MiB)圧縮率(%)
- 0 1 2 3 4 5 6 7 8 9
gzip - 337.32 35.75 33.95 32.29 31.26 30.46 30.32 30.27 30.27
bzip2 - 26.85 25.27 24.45 24.01 23.63 23.38 23.14 22.96 22.80
xz 30.65 29.71 26.48 22.38 21.68 21.13 20.56 20.11 19.73 19.50
xz -e 26.38 26.38 23.08 22.29 21.58 21.03 20.53 20.07 19.70 19.47
HTML アーカイブ(100MiB)圧縮率(%)
- 0 1 2 3 4 5 6 7 8 9
gzip - 15.45 14.94 14.57 13.55 13.08 12.70 12.66 12.54 12.52
bzip2 - 11.57 10.39 9.90 9.59 9.42 9.24 9.14 9.05 8.98
xz 11.43 10.83 9.55 8.59 8.30 8.15 7.78 7.65 7.52 7.48
xz -e 9.69 9.69 8.32 8.07 7.76 7.59 7.45 7.31 7.18 7.13
MeCab の出力(100MiB)圧縮率(%)
- 0 1 2 3 4 5 6 7 8 9
gzip - 15.13 13.79 12.97 11.48 10.69 10.07 9.97 9.88 9.88
bzip2 - 9.22 7.63 6.84 6.36 6.01 5.75 5.53 5.38 5.22
xz 10.13 8.86 6.07 4.98 4.47 4.19 3.43 3.21 3.06 3.02
xz -e 7.25 7.25 4.68 4.17 3.61 3.27 2.98 2.73 2.57 2.52
Linux Kernel 2.6.36 アーカイブ(400MiB)圧縮率(%)
- 0 1 2 3 4 5 6 7 8 9
gzip - 26.84 25.58 24.70 22.92 21.99 21.62 21.52 21.45 21.44
bzip2 - 20.21 18.85 18.23 17.84 17.58 17.38 17.21 17.09 16.99
xz 21.40 20.12 18.29 15.78 15.36 15.07 14.56 14.35 14.18 14.04
xz -e 17.97 17.97 15.91 15.44 15.01 14.70 14.45 14.24 14.06 13.92

実験結果の詳細(圧縮時間)

グラフの元になっている表です.上端の行は圧縮レベルを示しています.

テキストアーカイブ(100MiB)圧縮時間(秒)
- 0 1 2 3 4 5 6 7 8 9
gzip - 3.73 4.14 5.24 5.50 7.41 11.74 14.28 16.09 16.11
bzip2 - 17.97 17.90 18.07 18.38 18.76 19.51 19.07 20.10 19.89
xz 14.70 16.36 17.20 80.52 90.42 100.63 119.51 131.29 143.47 151.38
xz -e 72.78 72.72 89.07 98.52 109.63 121.90 133.15 147.36 158.90 168.35
HTML アーカイブ(100MiB)圧縮時間(秒)
- 0 1 2 3 4 5 6 7 8 9
gzip - 1.84 1.90 2.00 2.72 3.00 3.46 3.72 4.44 4.87
bzip2 - 28.78 30.4 32.53 32.98 34.12 35.18 35.68 36.51 37.25
xz 6.22 6.49 7.30 29.52 30.80 31.95 46.73 48.32 49.54 51.02
xz -e 106.48 106.62 117.79 121.82 125.18 128.71 131.83 134.65 136.44 138.04
MeCab の出力(100MiB)圧縮時間(秒)
- 0 1 2 3 4 5 6 7 8 9
gzip - 1.89 1.95 2.17 2.81 3.39 4.63 5.67 8.66 8.85
bzip2 - 21.42 23.27 24.36 25.46 26.62 27.78 28.81 29.64 30.41
xz 5.90 6.35 5.62 33.84 34.32 34.79 54.98 56.52 56.76 57.14
xz -e 101.9 102.02 124.32 134.22 140.79 147.46 156.22 166.67 168.9 172.86
Linux Kernel 2.6.36 アーカイブ(400MiB)圧縮時間(秒)
- 0 1 2 3 4 5 6 7 8 9
gzip - 10.80 11.68 13.15 15.20 18.98 24.53 28.29 37.32 43.19
bzip2 - 72.57 71.40 72.99 74.02 75.82 76.71 78.97 79.08 80.39
xz 40.57 45.10 47.68 233.74 255.55 277.73 378.17 407.96 437.03 472.82
xz -e 331.31 330.16 388.52 416.53 447.16 483.73 520.84 558.01 595.72 638.04

実験結果の詳細(復元時間)

グラフの元になっている表です.上端の行は圧縮レベルを示しています.

テキストアーカイブ(100MiB)復元時間(秒)
- 0 1 2 3 4 5 6 7 8 9
gzip - 0.93 0.90 0.87 0.84 0.84 0.82 0.81 0.82 0.82
bzip2 - 5.00 4.91 4.77 4.77 4.77 4.81 4.76 4.90 4.83
xz 4.22 4.04 3.36 2.80 2.66 2.55 2.50 2.49 2.50 2.54
xz -e 3.64 3.64 2.95 2.79 2.64 2.57 2.55 2.57 2.51 2.54
HTML アーカイブ(100MiB)復元時間(秒)
- 0 1 2 3 4 5 6 7 8 9
gzip - 0.53 0.51 0.49 0.47 0.45 0.43 0.43 0.42 0.42
bzip2 - 3.15 3.01 2.98 2.98 3.04 3.00 3.01 3.07 3.18
xz 1.73 1.65 1.40 1.32 1.27 1.25 1.21 1.21 1.21 1.25
xz -e 1.58 1.59 1.32 1.27 1.23 1.20 1.19 1.19 1.18 1.24
MeCab の出力(100MiB)復元時間(秒)
- 0 1 2 3 4 5 6 7 8 9
gzip - 0.53 0.51 0.49 0.47 0.45 0.43 0.43 0.42 0.42
bzip2 - 2.99 2.80 2.76 2.74 2.76 2.74 2.75 2.82 2.81
xz 1.54 1.36 0.93 0.81 0.73 0.70 0.60 0.61 0.60 0.64
xz -e 1.25 1.25 0.79 0.72 0.64 0.59 0.57 0.56 0.55 0.60
Linux Kernel 2.6.36 アーカイブ(400MiB)復元時間(秒)
- 0 1 2 3 4 5 6 7 8 9
gzip - 3.00 2.91 2.84 2.76 2.68 2.65 2.62 2.61 2.61
bzip2 - 16.74 16.15 16.01 16.07 15.97 15.98 16.03 16.06 16.24
xz 11.84 11.17 9.69 8.63 8.33 8.14 7.94 7.88 7.77 7.77
xz -e 10.50 10.49 8.89 8.55 8.22 8.05 7.94 7.83 7.80 7.75