圧縮アルゴリズムの一つに、LZ4というのがあります。
圧縮が早く、展開が非常に高速として有名で、サーバー間通信などで使われています。
このLZ4のJavaScript実装として、Lz4.jsがあります。
このLz4.jsの性能は、他の圧縮系ライブラリと比較してLZ4の特徴通り高速なのでしょうか。
推測するな、計測せよ
ということで、ベンチマークを取ってみることにしました。
実験
比較対象として、fflateを用います。
fflateはJavaScriptでDeflate圧縮展開を行うライブラリです。
同様のライブラリとして有名なpakoと比較して、圧縮展開が高速で、ファイルサイズも小さく、ZIPサポートやマルチスレッド対応など機能が追加されています。
ベンチマーク条件
- ブラウザ上で実行
- 圧縮・展開するファイルは約5MBのテキスト(C/Migemoの辞書)
結果
さて、結果は以下の通り
ライブラリ | level | 圧縮時間 | 展開時間 | サイズ比 |
---|---|---|---|---|
fflate | 0.0 | 23.7 | 6.0 | 1.000078 |
fflate | 1.0 | 183.8 | 79.8 | 0.398835 |
fflate | 2.0 | 199.5 | 65.5 | 0.391483 |
fflate | 3.0 | 221.7 | 42.4 | 0.386562 |
fflate | 4.0 | 248.5 | 42.1 | 0.382764 |
fflate | 5.0 | 255.7 | 42.1 | 0.382753 |
fflate | 6.0 | 346.2 | 40.3 | 0.378795 |
fflate | 7.0 | 389.3 | 41.0 | 0.378133 |
fflate | 8.0 | 465.8 | 40.4 | 0.377853 |
fflate | 9.0 | 467.9 | 40.5 | 0.377850 |
lz4js | NaN | 82.2 | 29.3 | 0.584434 |
グラフにしてみましょう。
まず、サイズ比と圧縮時間のグラフです。
fflateは圧縮レベルを0から9まで設定できます。
このうち、無圧縮の0を除いた1から9までの圧縮レベルによる結果が青色のプロットです。
圧縮レベルを大きくするほど、ファイルは小さくなりますが、圧縮時間は大きく伸びます。
オレンジ色でプロットしたLz4.jsは、fflateと比較して約半分の圧縮時間、1.5倍のファイルサイズとなりました。
LZ4の圧縮が高速という特徴どおり、Lz4.jsにおいても圧縮は高速です。
次に、サイズ比と展開時間のグラフです。
fflateでは圧縮レベルが大きいほど、展開が早くなっています。
圧縮レベル1・2は特に遅いですね。
Lz4.jsの展開時間はfflateの約3/4倍であり、やはり早いです。
まとめ
まとめると、Lz4.jsはLZ4アルゴリズムの特徴どおり、圧縮展開が高速です。
fflateと比較して圧縮時間は1/2、展開時間は3/4と小さくなります。
一方、圧縮後ファイルサイズはDeflateアルゴリズムに劣り、圧縮後は1.5倍のファイルサイズになるため、使い所を見極める必要があります。
補足
fflateの開発者も指摘していますが、Node.jsにはネイティブ実装のDeflateアルゴリズムがあります。
Node.jsでDeflateアルゴリズムを使うなら、fflateよりもzlibパッケージを検討すべきです。
Before you decide that fflate is the end-all compression library, you should note that JavaScript simply cannot rival the performance of a native program.
https://github.com/101arrowz/fflate
fflateのデフォルトの圧縮レベルは6です。
高速に圧縮する圧縮レベル1と比較して、圧縮レベル6は約2倍の圧縮時間のわりに、ファイルサイズはあまり変わりません。
今回の実験結果から、圧縮レベル3~5がちょうどいいのではないかと思います。