首页 > 其他分享 >ZSTD多线程压缩

ZSTD多线程压缩

时间:2023-04-22 16:23:05浏览次数:39  
标签:std include level ZSTD 压缩 ctx auto 多线程

测试代码:

 1 // main.cpp
 2 // 
 3 
 4 #include <iostream>
 5 #include <fstream>
 6 #include <vector>
 7 #include <chrono>
 8 #include <thread>
 9 #include "./zstd/lib/zstd.h"
10 
11 using byte = uint8_t;
12 using buffer = std::vector<byte>;
13 
14 using std::chrono::milliseconds;
15 using std::chrono::steady_clock;
16 using std::chrono::duration_cast;
17 
18 buffer read_file(const char* path)
19 {
20     std::ifstream s(path, std::ios::binary);
21     if (!s)
22         return {};
23     s.seekg(0, std::ios::end);
24     auto length = s.tellg();
25     s.seekg(0, std::ios::beg);
26     if (!length)
27         return {};
28     buffer buf(length, 0);
29     auto ptr = (char*)buf.data();
30     s.read(ptr, length);
31     if (!s)
32         return {};
33     return buf;
34 }
35 
36 int main()
37 {
38     // 1. 读取测试数据到内存
39     auto input = read_file("test.bmp");
40     // 2. 预估输出缓冲区大小
41     auto bufSize = ZSTD_compressBound(input.size());
42     // 3. 创建输出缓冲区
43     buffer output(bufSize, 0);
44     // 4. 设置压缩参数
45     auto level = 19; // ZSTD 多线程压缩时将 level 设置为 19 效率较高
46     auto num_threads = std::thread::hardware_concurrency(); // 获取CPU线程数
47     // 5. 创建压缩上下文
48     auto ctx = ZSTD_createCCtx();
49     ZSTD_CCtx_setParameter(ctx, ZSTD_c_compressionLevel, level);
50     ZSTD_CCtx_setParameter(ctx, ZSTD_c_nbWorkers, num_threads);
51     // 6. 执行压缩
52     auto tp1 = steady_clock::now();
53     auto result = ZSTD_compress2(ctx, output.data(), output.size(), input.data(), input.size());
54     auto tp2 = steady_clock::now();
55     // 7. 销毁压缩上下文
56     ZSTD_freeCCtx(ctx);
57     ctx = nullptr;
58 
59     if (ZSTD_isError(result))
60     {
61         std::cout << "error" << std::endl;
62         return 1;
63     }
64 
65     auto time = duration_cast<milliseconds>(tp2 - tp1).count();
66 
67     std::cout << "original: " << input.size() << std::endl;
68     std::cout << "compressed: " << result << std::endl;
69     std::cout << "elapsed: " << time << "ms" << std::endl;
70     std::cout << "level: " << level << std::endl;
71     std::cout << "threads: " << num_threads << std::endl;
72 
73     return 0;
74 }

测试代码使用VS2022编译通过。

编译ZSTD时确保预处理器有 ZSTD_MULTITHREAD=1 定义,可以直接引用源码文件夹里的 libzstd 项目。

结论:启用多线程压缩时, level <= 19 基本可以吃满CPU, level == 20 效率打五折, level >= 21 跟单线程没什么区别。

 

标签:std,include,level,ZSTD,压缩,ctx,auto,多线程
From: https://www.cnblogs.com/crsky/p/17343299.html

相关文章

  • python多线程接口请求
    importthreadingimportrequestsrequests.packages.urllib3.disable_warnings()urls_list=["http://127.0.0.1:5000"for_inrange(1,101)]response_ok=0response_error=0defget_response_code(url):globalresponse_errorglobalr......
  • 多线程 —— 线程的六种状态
    一、线程的六种状态,如下图所示二、六种状态介绍:线程状态具体含义NEW一个尚未启动的线程的状态。也称之为初始状态、开始状态。线程刚被创建,但是并未启动。还没调用start方法。MyThreadt=newMyThread()只有线程对象,没有线程特征。RUNNABLE当我们调用线程对象的s......
  • linux 中实现按照行压缩连续的重复
     001、(base)[b20223040323@admin1test2]$lsa.txt(base)[b20223040323@admin1test2]$cata.txt##测试数据erkjabababjkababuyddxyxyxyxyxymnmnmnue878787_k_kjhrtrt(base)[b20223040323@admin1test2]$awk'{temp=$1;printf(&......
  • 多线程的创建和使用
    多线程点击标题旁可查看目录一.基本概念1.线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小......
  • 【汇智学堂】JAVA多线程实现的小游戏-龟兔争霸-2
    角色入场:publicvoidpaint(Graphicsg){g.clearRect(0,0,1600,900);Imageimage=newImageIcon("D:\\综合案例\\10\\src\\tu.png").getImage();//获取图片资源g.drawImage(image,PositionA-50,100,RecWidth,RecHeight......
  • 【汇智学堂】JAVA多线程实现的小游戏-弹球-2
    显示球板Ui类/**\*定义界面*显示球板*/packagecom.huizhi;importjavax.swing.*;importjava.awt.*;publicclassUiextendsJFrame{staticintPositionA=50,RecWidth=50,RecHeight=20;publicUi(){setTitle("弹球游戏");......
  • iOS:多线程
    三个都是多线程相关的。GCD简单介绍iOS和osx的核心内核是XNU内核,GCD是基于XNU内核实现的GCD的API全部的libdispatch中GCD的底层实现主要是DispatchQueue和DispatchSourceGCD和NSOperation的区别GCD是纯C语言的API,NSOperation是基于GCD的封......
  • C#多线程学习(三) 生产者和消费者
    C#多线程学习(三)生产者和消费者线程学习第一篇:C#多线程学习(一)多线程的相关概念线程学习第二篇:C#多线程学习(二)如何操纵一个线程前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是几个线程同时执行一个函数,导致数......
  • Linux解压缩文件乱码的解决
    Linux解压缩文件乱码的解决使用unzip软件提供了-O参数(以及-I参数),可以指定编码。-OCHARSET为DOS,Windows和OS/2归档文件指定字符编码-ICHARSET为UNIX和其他归档文件指定字符编码 例子:解压缩example.zip文件到当前目录,使用归档管理器打开为乱码。example.zip为windows环......
  • 【调试】Valgrind内存泄漏内存越界|运行时间|调用|cache命中率|多线程竞态|堆栈分析..
    目录即看即用详细简介Valgrind工具详解安装使用检测内存泄漏其他内存问题memcheck工具的常用选型其他选项附录其他类似工具实例分析:03.使用未初始化的内存04.使用野指针05.动态内存越界访问06.分配空间后没有释放07.不匹配使用delete或者free08.两次......