内容
gzip、bzip2、xz のマルチコア版について試して実行速度などを見てみた。
テスト環境
CPU:Intel(R) Core i7-12700F
OS:Ubuntu 22.04.4(WSL)
メモリ:32GB
論理プロセッサー数
grep processor /proc/cpuinfo | wc -l
20
コア数20相当
バイナリファイルに対する圧縮と展開について
391Mib のバイナリファルに対して実験を行った。
圧縮オプションは、一番圧縮率が高いものを選択した。
それぞれのコマンドオプションは、以下としている。
xz はコマンド自体がマルチコア対応しているので、オプション変更で実験をした。
コマンド | 圧縮時オプション | 展開時オプション |
---|---|---|
gzip | -9 | -d |
bzip2 | -9 | -d |
xz | -9 | -d |
pigz(gzipのマルチコア版) | -9 | -d |
pbzip2(bzip2のマルチコア版) | -9 | -d |
xz | -T0 | -T0 -d |
ノーマル版
コマンド | 圧縮にかかる時間 | 展開にかかる時間 | 圧縮率 |
---|---|---|---|
gzip | 18s | 1.2s | 9.64% |
bzip2 | 21s | 3.2s | 7.88% |
xz | 1m21s | 1.59s | 5.08% |
xz の圧縮率は高いものの、圧縮にかかる時間が長い。
xz について、展開時間は速い。ファイルが小さくなっているためにIO処理は少ないことが影響しているかもしれない。
マルチコア版
コマンド | 圧縮にかかる時間 | 展開にかかる時間 | 圧縮率 |
---|---|---|---|
pigz | 1.09s | 0.65s | 9.64% |
pbzip2 | 2.65s | 0.42s | 7.88% |
xz -T0 | 7.1s | 1.67s | 5.54% |
マルチコアでも圧縮率はほぼ変わらないが、少し落ちているところもある。
topコマンドで確認をしたが、20コアで処理がされており、マルチコア版での圧縮速度の向上率から言えば、
xz(19.9倍)>pigz(16.5倍)>pbzip2(7.92倍) であった。
実用を考えると、pbzip2 が時間、圧縮率のバランスがよいのではないかという考えもある。
テキストファイルに対する圧縮と展開について
303MiB のJSONファイルを対象に行った。
ノーマル版
コマンド | 圧縮にかかる時間 | 展開にかかる時間 | 圧縮率 |
---|---|---|---|
gzip | 4.48s | 0.965s | 10.37% |
bzip2 | 28s | 4.608s | 8.29% |
xz | 1m3s | 1.51s | 6.90% |
マルチコア版
コマンド | 圧縮にかかる時間 | 展開にかかる時間 | 圧縮率 |
---|---|---|---|
pigz | 0.354s | 0.607s | 10.34% |
pbzip2 | 4.65s | 0.746s | 8.29% |
xz -T0 | 9.4s | 1.658s | 7.90% |
こちらも圧縮率にはほぼ変化がないが、xzはマルチコア実行したときの方が若干悪くなっている。
bzip2 について、圧縮にかかる時間がgzipよりもかかっているが、バイナリのときよりもテキストファイルを対象にした方が差が開いている。
マルチコア版での圧縮速度の向上率から言えば、
xz(13倍)>pigz(12.7倍)>pbzip2(6.02倍) であった。
2~3%の圧縮率の差を気にしないならば、pigz が速い。
pbzip2 についてコア数による比較
pbzip2 について -pオプションで利用するコア数を明示的に指定した。
対象は、303MiB のJSONファイルとした。
コア数 | 圧縮にかかる時間 | 展開にかかる時間 | コア1からの時間比 |
---|---|---|---|
1 | 29.3s | 4.88s | 1 |
2 | 14.2s | 2.039s | 1/2.1 |
3 | 9.609s | 1.360s | 1/3.0 |
4 | 7.420s | 1.039s | 1/4.0 |
5 | 6.90s | 1.193s | 1/4.2 |
10 | 4.764s | 0.807s | 1/6.2 |
15 | 5.027s | 0.765s | 1/5.8 |
20 | 4.92s | 0.791s | 1/6.0 |
なお、圧縮結果のバイト数はどれでも同じであった。
コア数が4まではほぼ線形で圧縮にかかる時間は短くなっているが、10を超えるとコア数を増やしても時間は短くなっていない
まとめ
マルチコア環境で、大きなファイルを圧縮したい場合には、pigz などマルチコア対応のコマンドを使おう。