高速圧縮アルゴリズムsnappyのgzipとの比較

昨日、snappyという圧縮アルゴリズムについて書きました。

高速な圧縮・解凍アルゴリズムsnappy

今日は、snappyとgzipとの比較について書きます。

スクリーンショット 2013-11-26 20.00.35

テストデータ

テストデータは、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

確かに圧縮率はいまいちだけど、速度は早い!

About katty0324

Scroll To Top