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