我正在为网络内容实施Deflate和GZip压缩。 .NET Framework DeflateStream执行得非常好(它不像SharpZipLib那样压缩它,但速度要快得多)。不幸的是它(以及我所知道的所有其他库)都错过了编写预压缩数据的函数,如stream.WritePrecompressed(byte [] buffer)。
使用此功能,可以在流中插入预压缩块。这可以减少压缩此部件的CPU负载并增加Web服务器的总吞吐量。
是否有任何托管lib能够执行此操作?或者,除了来自ComponentAce的ZLIB.NET之外还有什么好的起点吗?
答案 0 :(得分:1)
另一种方法是刷新deflater流(也可能关闭它),以保证所有缓冲的压缩数据都写入输出流,然后简单地将预压缩数据写入底层输出流,然后重新打开deflater流再次出现在输出流的顶部。
答案 1 :(得分:0)
IIRC#ZipLib允许您设置压缩级别,您是否尝试刷新流并将级别降为0然后再次提升压缩级别之前发送已压缩的数据?
如果您只是出于性能原因考虑这样做,那么这可能是一个可接受的解决方案。
答案 2 :(得分:0)
是的,您可以将预压缩块插入到zlib流中。从zlib源代码中的zpipe.c示例开始。只有在你想要插入预压缩块的地方,用Z_FULL_FLUSH替换Z_NO_FLUSH(否则不要使用Z_FULL_FLUSH,因为压缩率会受到影响。)
现在压缩输出是字节对齐的,最后一个deflate块关闭。完全刷新意味着经过预压缩块的下一个块不能包含任何反向引用。
将预压缩块附加到输出流(例如memcpy)。将strm.next_out前进到下一个空字节。在你离开的地方继续放气。
flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
ret = deflate(&strm, flush);