mikutterのアーカイブでxz圧縮の効果を検証する

3日連続でコードの解説を書いた反動でブログスイッチが切れてました。しかも今回はClojureとまったく関係ありません。ごめんなさい。

mikutterとは

mikutterは「シンプルでパワフルで萌え萌えなTwitterクライアント*1」です。詳しくはmikutter、README、またはREADMEを参照してください。

xzとは

LZMA系の圧縮アルゴリズムを使い、XZ Utilsのコマンド(Windowsでも動く)がgzipやbzip2のコマンドのように動くのでUnixな人々にも優しいファイルフォーマットです。詳しくはThe .xz file formatを参照してください。

一般に次のような特徴があると言われています。

  • 圧縮率はgzipやbzip2より良い。
  • 圧縮速度はgzipやbzip2より遅い。

つまり、圧縮頻度より展開頻度が多い*2圧縮ファイルに向いています。例えば、……ソースコードアーカイブとか。

今回はmikutter 0.0.3.540を対象に、xzの効果を検証します。

実験に使うハードウェアとソフトウェア

  • Mobile AMD Sempron(tm) 3400+(シングルコア・800MHz)、895716kBのメモリを備えた五年前のノートパソコン。
  • GNU tar 1.22
  • gzip 1.3.12
  • bzip2 1.0.5
  • xz 5.0.3

実験

配布されているアーカイブを展開してdu -bした所、圧縮前のサイズは約6.42MB(6420229バイト)でした。

最初はtarコマンドのオプションで圧縮して比較します。

コマンド 圧縮形式 時間 サイズ 圧縮率
tar zcf gzip 0.422秒 2.01MB(2013972バイト) 31.4%
tar jcf bzip2 2.874秒 1.64MB(1643739バイト) 25.6%
tar Jcf xz 4.788秒 1.41MB(1412920バイト) 22.0%

gzipの圧倒的な速度が目を引きます。xzはgzipの約12倍の時間をかけ、約600KBを削減しています。

しかし、xzには-e/--extremeという、速度を犠牲にして更に圧縮率を高める(かもしれない)オプションがあります。また、man xzには次のような事が書かれています。

  • gzip(1)やbzip2(1)と同じ感覚でなんでもかんでも-9で圧縮するのは良い考えではない。
  • 時々、-0はgzip -9より速く、圧縮率が良い。
  • デフォルトの-6は16MiBしかメモリがないようなシステムで展開されるファイルにも使える、一般に良い選択肢。

というわけで、次はtarコマンドで圧縮はせずに、gzip -9、bzip2 -9、xz -0、xz -6、xz -9、xz -9eを使って圧縮して、展開はtarコマンドのオプション指定で計測します。

圧縮コマンド 圧縮時間 サイズ 圧縮率 展開時間
gzip -9 0.824秒 2.01MB(2006397バイト) 31.3% 0.158秒
bzip2 -9 2.899秒 1.64MB(1643739バイト) 25.6% 0.650秒
xz -0 1.384秒 1.57MB(1571568バイト) 24.5% 0.387秒
xz -6 4.746秒 1.41MB(1412920バイト) 22.0% 0.388秒
xz -9 4.830秒 1.41MB(1412920バイト) 22.0% 0.355秒
xz -9e 7.816秒 1.42MB(1420480バイト) 22.8% 0.452秒

今回は-eがうまくいかないデータだったようで、時間は極端に(extremely)増えたにも関わらずサイズが-9よりも大きくなっています。また、-6と-9は同じサイズになっています。-9で行う計算が-6と差ができる程度には利かなかったようです。

展開はbzip2が最も遅く、xzは-9e以外は0.4秒弱に収まっていますが、gzipの0.2秒未満と比べると少し遅いです。

今回のxz -0はgzip -9よりも速くはありませんが、bzip2を圧縮速度、サイズ、展開速度で上回りました。

まとめ

今回実験に使ったハードウェアは少し古いノートパソコンなので、典型的なmikutterユーザ/開発者の環境に比べると計算速度、IO速度共に多少遅いかもしれません。

また、LZMA系のアルゴリズムはバイナリファイルでも圧縮率がそれなりに良いのですが、mikutterのソースはほぼテキストファイルなのであまり差が出ませんでした。

今回実験に使ったGNU tar 1.22は2009年にリリースされた、xz圧縮/展開をパイプせずに行えるバージョンです。また、最近のUbuntu、最近のMac OS Xにはデフォルトでxzがインストールされているようです。(参考:Re: xz 圧縮について (M+ OUTLINE FONTS 640) - M+ FONTS - OSDNRe: xz 圧縮について (M+ OUTLINE FONTS 643) - M+ FONTS - OSDN


xz圧縮はここ数年でパッケージ管理ソフトウェアのアーカイブでも利用されるようになりました。まだ使ったことのない方は是非試してください。

*1:訳注:意訳。

*2:一度だけ圧縮して、後からそれを何度も展開するのが理想的。