2013年9月2日月曜日

各種圧縮ソフト 圧縮速度と圧縮率の比較(並列版含む)

Unix-like 環境でよく使われるアーカイバの圧縮速度、圧縮率を比較しました。

比較したツール

すべて CentOS 6.4 / EPEL のレポジトリのビルドを使用しました。

比較した環境

  • CPU: Intel Core i7 2600
  • SSD: Crucial m4
  • Memory: DDR3-1600 16GB

ベンチマーク内容

圧縮に使ったファイルは、数GBあるMySQL のダンプです。

cat original | command > original.compressed

という形でベンチマークしました。

下記の表は gzip の標準状態を 1 とした相対的な数値を示しています。 Software 欄の -1 や -9 は、コマンドに指定できる圧縮率です。 -1 が最低、 -9 が最高になっているコマンドが多いです。

並列に実行できるものに関してはすべて 8 スレッドで実行しています。

ベンチマーク結果

time real
実際の経過時間
time user
CPU user 時間
compression ratio
圧縮率の比。大きいほどファイルが大きい。
compression ratio (single/parallel)
並列版について、シングルスレッドに対する圧縮率の比
parallel overhead
シングルスレッド版と比較した CPU user時間の比


Softwaretime realtime usercompression ratiocompression ratio (single/parallel)parallel overhead
lzo0.220.191.55
lzo -94.914.931.25
gzip -10.500.491.15
gzip1.001.001.00
bzip2 -14.414.460.86
bzip25.875.940.79
xz -11.961.980.94
xz17.8618.140.72
pigz -10.100.771.151.001.56
pigz0.201.551.001.001.55
pbzip2 -10.957.600.861.001.70
pbzip21.5712.530.791.002.11
pxz -10.463.610.961.031.83
pxz4.1128.350.731.011.56

棒グラフが相対的な経過時間、緑の点が相対的な圧縮率です。


xz が飛び出てわかりづらいので、xz以外のシングルスレッド系圧縮ソフトを並べました。

lzo が極めて高速ですがgzipに比べ1.5倍程度のサイズになりました。 lzo の最大圧縮はとても速度が遅いにもかかわらず gzip -1 より圧縮率が悪くなりました。
bzip2 は -1..-9 は厳密には圧縮率ではないので、他のソフトに比べて差が小さかったです。圧縮速度と圧縮率のバランスが良いように思います。
xz はさすがの遅さでした。ただ、 xz -1 や(今回は測っていませんが) xz -2 であれば、bzip2 より高速にもかかわらず肉薄する圧縮率を出すので、かなり優秀だと思います。
gzip は圧縮速度と圧縮率のバランスが取れています。

次にマルチスレッド系圧縮ソフトです。棒グラフが相対的な経過時間、緑の点が並列化のオーバーヘッド(シングルスレッド版に対するCPU user timeの比)、赤い点がシングルスレッド版に対する圧縮率の比です。


ご覧のように、シングルスレッド版に対して圧縮率はほとんど変わりません。シングルスレッド版に対する実行時間は bzip2 が若干高く2倍を超えましたが、その他は1.5倍~1.8倍程度でした。

まとめ

圧縮速度と圧縮率のバランスが取れているのは gzip で、並列版の性能も優秀でした。速度をある程度要求される環境下においても、 lzo には並列版がないので、CPUをたくさん使えるのであればこれで決まりな気がします。

xz は最高の圧縮率でした。 ただ、時間をかけて圧縮する用途にしても、さすがに時間がかかりすぎの気もします... 今回は測っていませんが、bzip2 より展開は早い(らしい)ので、ファイルを配布するなどの用途には向いているのでしょう。

bzip2 は圧縮率こそ xz に叶いませんが、実行速度とのバランスは優れていると思います。展開に時間が掛かるのがデメリットですが、一応保存しておく系のログファイルなどには使えるのではないでしょうか。

lzo の高圧縮モードは今回の測定だと出番がないように見えますが、展開が gzip に比べてメモリや時間が少なくて済むので、組込み用途では活躍しそうです。

補足

xz のマルチスレッド版には pixz というのもありますが、これは圧縮アルゴリズムにも少し手を加えており、 xz とファイルの互換性がありません。 環境によってはビルドが失敗するなど、これからに期待です。 ファイルの互換性はあるようです。また、私の環境でビルドが失敗したのは単にSDKが古いから説が浮上したので、今度追試します。

pxz は xz を単純にマルチスレッドにしたもので、圧縮が終わってからファイルを連結するので、メモリとディスクの使用量がかなり大きくなります。

今回は展開速度に関しては測っていませんので、展開を頻繁に行う場合はそちらも考慮する必要があります。

1 件のコメント: