昨日、snappyという圧縮アルゴリズムについて書きました。
高速な圧縮・解凍アルゴリズムsnappy
今日は、snappyとgzipとの比較について書きます。
テストデータ
テストデータは、Growth Pushの計測データを模倣したランダムデータです。
[
{
"goalId" : 1,
"timestamp" : 5448497578764886016,
"clientId" : 5861785,
"value" : null
},
{
"goalId" : 1,
"timestamp" : 6626364349806644224,
"clientId" : 4179543,
"value" : null
}, ...
]
こんな感じのJSONをバイト配列にしました。作ってみたら、約38MBになりました。
計測プログラム
ざっくり比較したかっただけなので、あまり厳密性は意識していません。gzipはStreamを使う以外の圧縮・解凍手法が分からなかったので、いまいちかっこわるい感じになっています。IOUtilsの速度測ってるんじゃないか疑惑はいったん置いておきます。TRIALで指定している試行回数は100回です。
snappyの圧縮コードです。
for (int i = 0; i < TRIAL; i++) {
start = System.nanoTime();
byte[] compressedBytes = Snappy.compress(bytes);
end = System.nanoTime();
elapsed += (double) (end - start) / 1e6;
}
snappyの解凍コードです。
for (int i = 0; i < TRIAL; i++) {
start = System.nanoTime();
byte[] uncompressedBytes = Snappy.uncompress(compressedBytes);
end = System.nanoTime();
elapsed += (double) (end - start) / 1e6;
}
gzipの圧縮コードです。
for (int i = 0; i < TRIAL; i++) {
start = System.nanoTime();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
gzipOutputStream.write(bytes);
gzipOutputStream.close();
byte[] compressedBytes = byteArrayOutputStream.toByteArray();
end = System.nanoTime();
elapsed += (double) (end - start) / 1e6;
}
gzipの解凍コードです。
for (int i = 0; i < TRIAL; i++) {
start = System.nanoTime();
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(new GZIPInputStream(new ByteArrayInputStream(compressedBytes)), out);
byte[] uncompressedBytes = out.toByteArray();
end = System.nanoTime();
elapsed += (double) (end - start) / 1e6;
}
結果発表!
「MessagePack、Kryo、Protocol Buffersなどのシリアライザーのパフォーマンス比較」と同じく、MacBook Pro Retina 13-inch(2.4GHzデュアルコアIntel Core i5プロセッサ)で実行しました。
アルゴリズム | 圧縮率 | 圧縮時間 | 解凍時間 |
snappy | 66.1 % | 160.7 ms | 58.00 ms |
gzip | 79.8 % | 1176 ms | 201.2 ms |
確かに圧縮率はいまいちだけど、速度は早い!
コメント
[…] つづき→「高速圧縮アルゴリズムsnappyのgzipとの比較」 […]