You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

zlib compress2()压缩1.5GB缓冲区耗时30秒是否正常?

zlib compress2()压缩1.5GB数据耗时30秒的合理性说明

这个耗时不属于压缩级别1下的正常表现。
zlib压缩级别1是速度优先档位,在近年主流x86桌面CPU上单线程运行时,常规压缩吞吐为100300MB/s,1.5GB数据的纯压缩耗时通常在515秒区间,30秒的观测值明显偏慢,大概率是测量方式或运行环境问题导致,常见原因如下:

  • 计时范围包含非压缩开销:当前代码的计时起点早于compress2()调用,把new unsigned char[compressedSize]的大内存分配操作也计入了耗时。一次性申请1.5GB以上堆内存时,若触发操作系统内存规整、物理页映射,本身就可能消耗数秒到十数秒,这部分开销和压缩逻辑无关。
  • 实际运行压缩等级不符:参数中传入的等级1是最快档,若该参数被意外修改为默认等级6,压缩吞吐会降到3080MB/s,1.5GB数据耗时恰好会落在2050秒区间,和观测值吻合。
  • 编译选项影响:如果使用未开启O2/O3优化的Debug模式编译zlib,运行速度会比Release版本慢2~3倍,也可能出现30秒的耗时。
  • 运行环境限制:压缩时若CPU处于节能降频状态、核心被其他进程抢占、内存带宽被占满,或是访问的缓冲区是未预热的冷内存触发大量缺页中断,都会导致耗时异常升高。

排查验证方法

  1. 调整计时逻辑,排除非压缩操作的干扰,单独统计compress2()的纯执行时间,可参考如下调整:
char* buffer = new char[originalBufferSize];
long unsigned int compressedSize = compressBound(originalBufferSize);
unsigned char * pData = new unsigned char[compressedSize];

// 预热内存,消除首次访问的缺页中断影响
memset(buffer, 0x33, originalBufferSize);
memset(pData, 0, compressedSize);

// 计时范围仅包裹compress2调用
auto start = high_resolution_clock::now();
int nResult = compress2((Bytef*)(pData), &compressedSize, (const Bytef*)buffer, originalBufferSize, 1);
auto stop = high_resolution_clock::now();
auto duration = duration_cast<milliseconds>(stop - start);

std::cout << "\nPure compress time: "<< duration.count() / 1000.0 << " seconds" << std::endl;
  1. 检查compress2()的返回值是否为Z_OK,排除参数错误、内存不足等异常情况导致的额外耗时。
  2. 用100MB左右的小数据块测试压缩吞吐,和同硬件下的zlib基准性能对比,确认是否存在硬件性能瓶颈。

内容的提问来源于stack exchange,提问作者adiBoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:09:29