snappy
snappy是由google開發的壓縮/解壓C++庫,注重壓縮速度,壓縮后文件大小比其它算法大一些
snappy在64位x86並且是小端的cpu上性能最佳
- 在Intel(R) Core(TM)2 2.4GHz中測試數據:
壓縮速率:~200-500MB/s
解壓速率:~400-800MB/s - 壓縮比(壓縮數據大小/原始數據大小):
對於HTML:~25%
對於普通文本(plain text):~50%
對於JPEG等已經壓縮過的文件:~100%
壓縮/解壓demo
/**
* 壓縮數據
* @param bs 輸入的字節數組
* @return 經過壓縮的數據
*/
Bytes SnappyCompress::compress(BytesConstRef bs) {
// 提前分配足夠的空間
Bytes ret(snappy::MaxCompressedLength(bs.size()));
size_t compressedLen = 0;
// 進行壓縮
snappy::RawCompress(
reinterpret_cast<const char*>(bs.data()),
bs.size(),
reinterpret_cast<char*>(ret.data()),
&compressedLen
);
// 調整為實際的壓縮長度
ret.resize(compressedLen);
return ret;
}
/**
* 解壓數據
* @param bs 經過壓縮的字節數組
* @return 經過解壓的數據
* @throw 輸入的壓縮數據損壞拋出CorruptedInput異常
*/
Bytes SnappyCompress::uncompress(BytesConstRef bs) {
// 解析出解壓數據的長度(花費O(1)時間)
size_t uncompressedLen = 0;
bool status = snappy::GetUncompressedLength(
reinterpret_cast<const char*>(bs.data()),
bs.size(),
&uncompressedLen
);
if (!status) {
// 解析長度編碼出錯
throw CorruptedInput();
}
// 提前分配空間
Bytes ret(uncompressedLen);
// 進行解壓
status = snappy::RawUncompress(
reinterpret_cast<const char*>(bs.data()),
bs.size(),
reinterpret_cast<char*>(ret.data())
);
if (!status) {
// 壓縮數據損壞
throw CorruptedInput();
}
return ret;
}