Compression zlib deflate:为什么它会积累短数据而不';在输入缓冲区满之前,是否启动压缩?

Compression zlib deflate:为什么它会积累短数据而不';在输入缓冲区满之前,是否启动压缩?,compression,zlib,deflate,gzip,Compression,Zlib,Deflate,Gzip,在zlib的deflate实现中,注意到当给定数据的长度很小时,zlib函数会将数据复制到输入缓冲区,并且只有在输入缓冲区已满时才开始压缩 当给定数据的长度大于输入缓冲区大小时,zlib函数直接开始压缩 默认输入缓冲区大小为8KB 我想知道将短数据积累到输入缓冲区的好处。我能想到的是: 避免花费在块处理上的开销,包括哈夫曼树初始化和CRC计算 在8KB(或更大)的数据块上保持I/O工作,有利于提高性能 谁能知道更多的见解与我分享你的想法,或指向我一些参考 相关代码: if (len <

在zlib的deflate实现中,注意到当给定数据的长度很小时,zlib函数会将数据复制到输入缓冲区,并且只有在输入缓冲区已满时才开始压缩

当给定数据的长度大于输入缓冲区大小时,zlib函数直接开始压缩

默认输入缓冲区大小为8KB

我想知道将短数据积累到输入缓冲区的好处。我能想到的是:

  • 避免花费在块处理上的开销,包括哈夫曼树初始化和CRC计算
  • 在8KB(或更大)的数据块上保持I/O工作,有利于提高性能
谁能知道更多的见解与我分享你的想法,或指向我一些参考

相关代码:

if (len < state->size) {
    /* copy to input buffer, compress when full */
    do {
        if (strm->avail_in == 0)
            strm->next_in = state->in;
        n = state->size - strm->avail_in;
        if (n > len)
            n = len;
        memcpy(strm->next_in + strm->avail_in, buf, n);
        strm->avail_in += n;
        state->x.pos += n;
        buf = (char *)buf + n;
        len -= n;
        if (len && gz_comp(state, Z_NO_FLUSH) == -1)
            return 0;
    } while (len);
}
else {
    /* consume whatever's left in the input buffer */
    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
        return 0;

    /* directly compress user buffer to file */
    strm->avail_in = len;
    strm->next_in = (voidp)buf;
    state->x.pos += len;
    if (gz_comp(state, Z_NO_FLUSH) == -1)
        return 0;
}
if(lensize){
/*复制到输入缓冲区,满时压缩*/
做{
如果(strm->avail\u in==0)
strm->next_in=state->in;
n=状态->大小-标准库存->有效库存;
如果(n>len)
n=len;
memcpy(strm->next_in+strm->avail_in,buf,n);
strm->avail_in+=n;
状态->x.pos+=n;
buf=(char*)buf+n;
len-=n;
if(len&gz_comp(state,Z_NO_FLUSH)=-1)
返回0;
}while(len);
}
否则{
/*使用输入缓冲区中剩余的内容*/
如果(strm->avail_in&&gz_comp(state,Z_NO_FLUSH)=-1)
返回0;
/*直接将用户缓冲区压缩到文件*/
strm->avail_in=len;
strm->next_in=(voidp)buf;
状态->x.pos+=len;
如果(gz_comp(state,Z_NO_FLUSH)=-1)
返回0;
}

deflate压缩数据格式由块组成,这些块的标题取决于块数据。因此,deflate每次输出一个块,在第一个块完成之前,不会写入任何内容(zlib或gzip头除外)

zlib的deflate累积数据,直到默认设置生成16K符号为止。符号可以是编码为文字的单字节,也可以是长度/距离对,它编码前32K未压缩数据中最多258字节的副本。因此,在发出第一个块之前,将累积从16K到最多4MB的未压缩数据(对于高度可压缩的数据)

一旦数据被累积,zlib决定构造什么样的块,然后这样做,创建头部,对于动态块,头部描述块中的哈夫曼码,然后为该块创建编码符号。或者,它创建一个存储的或静态的块,不管结果是多少,都会得到最少的位数。只有这样,压缩数据才可用

这是重复的,因此,如果您正在为其提供小的输入缓冲区,则deflate压缩数据看起来将以突发方式可用。对于大的输入缓冲区,它也在做同样的事情,但是你并没有很容易地看到延迟,但它仍然存在