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处于节能降频状态、核心被其他进程抢占、内存带宽被占满,或是访问的缓冲区是未预热的冷内存触发大量缺页中断,都会导致耗时异常升高。
排查验证方法
- 调整计时逻辑,排除非压缩操作的干扰,单独统计
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;
- 检查
compress2()的返回值是否为Z_OK,排除参数错误、内存不足等异常情况导致的额外耗时。 - 用100MB左右的小数据块测试压缩吞吐,和同硬件下的zlib基准性能对比,确认是否存在硬件性能瓶颈。
内容的提问来源于stack exchange,提问作者adiBoy
相关产品推荐
相关产品推荐

