【发布时间】:2016-09-14 13:55:44
【问题描述】:
我正在玩 zlib 并且有(简化的)这样的代码:
#include <cstring> // memset
#include <string>
#include <zlib.h>
#include <cstdio>
const int compressionLevel_ = 9;
const size_t BUFFER_SIZE = 1024 * 8;
char buffer_[BUFFER_SIZE];
std::string compress(const char *data, size_t const size){
z_stream zs;
memset(&zs, 0, sizeof(zs));
if (deflateInit(&zs, compressionLevel_) != Z_OK)
return {};
zs.next_in = reinterpret_cast<Bytef *>( const_cast<char *>( data ) );
zs.avail_in = static_cast<uInt>( size );
std::string out;
int result;
do {
zs.next_out = reinterpret_cast<Bytef *>(buffer_);
zs.avail_out = BUFFER_SIZE;
result = deflate(&zs, Z_FINISH);
if (out.size() < zs.total_out){
// COMMENT / UNCOMMENT HERE !!!
out.append(buffer_, zs.total_out - out.size() );
}
} while (result == Z_OK);
deflateEnd(&zs);
if (result != Z_STREAM_END)
return {};
return out;
}
int main(){
const char *original = "Hello World";
size_t const original_size = strlen(original);
for(size_t i = 0; i < 1000000; ++i){
const auto cdata = compress(original, original_size);
}
}
真正的代码有点大,因为它解压并检查解压后的字符串是否与原始字符串相比。
如果我用 clang 或 gcc 编译,一切都会执行大约 5 秒。
但是...如果我评论这一行:
if (out.size() < zs.total_out){
// COMMENT / UNCOMMENT HERE !!!
// out.append(buffer_, zs.total_out - out.size() );
}
执行需要 30 秒!!!
如果我在快速 Linux 服务器上尝试,时间分别是 3 秒和 18 秒。
我在 MacOS 上用 clang 尝试过同样的操作,时间上没有太大差异。
我尝试了不同级别的优化,结果保持不变 - 如果您发表评论,您将获得约 10 倍的执行时间。
可能是什么原因?
更新
我在 Cygwin 上用 gcc 试过 - 那里的时间没有区别。
我厌倦了使用 gcc 的 Linux Arm CPU - 25 秒 vs 2:20 分钟。
【问题讨论】: