snappy简单测试

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值