2

我正在为 Web 内容实施 Deflate 和 GZip 压缩。.NET Framework DeflateStream 的性能非常好(它的压缩效果不如 SharpZipLib,但速度要快得多)。不幸的是,它(以及我知道的所有其他库)错过了写入预压缩数据的函数,例如 stream.WritePrecompressed(byte[] buffer)。

使用此功能,可以在流中插入预压缩块。这可以减少压缩这部分的 CPU 负载并增加 Web 服务器的总吞吐量。

是否有任何托管库能够做到这一点?或者,除了 ComponentAce 的 ZLIB.NET 之外,还有什么好的起点可以做到这一点?

4

3 回答 3

1

另一种方法是刷新 deflater 流(也可能关闭它),以保证所有缓冲的压缩数据都写入输出流,然后简单地将预压缩数据写入底层输出流,然后重新打开 deflater 流再次在您的输出流之上。

于 2009-10-06T23:01:19.763 回答
0

IIRC #ZipLib 允许您设置压缩级别,您是否尝试过刷新流并将级别降至 0,然后在再次提高压缩级别之前发送已经压缩的数据?

如果您只是出于性能原因考虑这样做,那么这可能是一个可以接受的解决方案。

于 2009-09-16T22:19:58.093 回答
0

是的,您可以将预压缩块插入到 zlib 流中。从 zlib 源代码中的 zpipe.c 示例开始。仅在要插入预压缩块的地方,将 Z_NO_FLUSH 替换为 Z_FULL_FLUSH(否则不要使用 Z_FULL_FLUSH,因为压缩率会受到影响。)

现在压缩输出是字节对齐的,最后一个 deflate 块被关闭。完全刷新意味着经过预压缩块的下一个块不能包含任何反向引用。

将您的预压缩块附加到输出流(例如 memcpy)。将 strm.next_out 推进到下一个空字节。从上次停止的地方继续放气。

flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
ret = deflate(&strm, flush);
于 2017-03-17T03:58:54.117 回答