snappy是一个比较快的压缩算法,没有cli, 需要自己写一个。
#include <snappy.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <chrono>
// 读取文件内容
std::vector<char> readFile(const std::string& filePath) {
std::ifstream file(filePath, std::ios::binary);
if (!file.is_open()) {
throw std::runtime_error("无法打开文件: " + filePath);
}
// 读取文件内容到 vector
file.seekg(0, std::ios::end);
size_t fileSize = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<char> buffer(fileSize);
file.read(buffer.data(), fileSize);
return buffer;
}
// 测量时间的模板函数
template <typename Func, typename... Args>
void measureTime(const std::string& operationName, Func func, Args&&... args) {
auto start = std::chrono::high_resolution_clock::now();
func(std::forward<Args>(args)...);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << operationName << " 耗时: " << elapsed.count() << " 秒" << std::endl;
}
int main(int agc, char**argv)
{
if(agc< 2)
{
std::cout << "请给一个文件作来测试\n";
return -1;
}
const std::string filePath = argv[1];
try {
std::cout << "读取文件..." << std::endl;
std::vector<char> fileData = readFile(filePath);
snappy::CompressionOptions opt;
opt.level = 2; //同max
size_t compressed_length = 0;
std::vector<char> compressedData(fileData.size());
std::vector<char> decompressedData(fileData.size());
// 压缩数据
measureTime("压缩数据", [&]() {
snappy::RawCompress(fileData.data(), fileData.size(), compressedData.data(),&compressed_length,opt);
});
std::cout << "原始大小:" << fileData.size() << " 压缩后大小:"<< compressed_length
<< " ratio:"<< (double)((double)fileData.size()/(double)compressed_length ) << std::endl;
// 解压缩数据
measureTime("解压缩数据", [&]() {
snappy::RawUncompress(compressedData.data(),compressed_length, decompressedData.data());
});
} catch (const std::exception& e) {
std::cerr << "发生错误: " << e.what() << std::endl;
}
return 0;
}
编译命令如下,需要c++11
clang++ -std=c++11 test.cpp -o test -lsnappy -L lib/