← 返回目录

snappy简单测试

发布时间: 2025-01-24 11:30:46
浏览量: 262
点赞数: 2
标签: xcode, macos, ide
snappy是一个比较快的压缩算法,没有cli, 需要自己写一个。

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/