浅谈在c#中使用Zlib压缩与解压的方法 (2)

以下是我使用该方案简单包装的方法:

public static byte[] SharpZipLibCompress(byte[] data) { MemoryStream compressed = new MemoryStream(); DeflaterOutputStream outputStream = new DeflaterOutputStream(compressed); outputStream.Write(data, 0, data.Length); outputStream.Close(); return compressed.ToArray(); } public static byte[] SharpZipLibDecompress(byte[] data) { MemoryStream compressed = new MemoryStream(data); MemoryStream decompressed = new MemoryStream(); InflaterInputStream inputStream = new InflaterInputStream(compressed); inputStream.CopyTo(decompressed); return decompressed.ToArray(); } 速度对比

为了对比几种方法在压缩与解压效率上的优劣,我准备了两组数据做了一个简单的测试。

第一组为短数据,是一个简单的字符串 "this is just a string for testing, see how this compression thing works."
第二组为长数据,是在网上下载到的英文版的 《冰与火之歌:权利的游戏》txt文本,大小约1.7mb。

我分别用每个方法压缩和解压短数据1000次,长数据100次, 最终的结果如下:

Length of Short Data: 144 Length of Long Data: 1685502 ============================================ Compress and decompress with Microsoft Zlib Compression (1000 times): 54 Compress and decompress with Microsoft Zlib Compression (long data 100 times): 7924 ============================================ Compress and decompress with Zlib.net Compression (1000 times): 254 Compress and decompress with Zlib.net Compression (long data 100 times): 9924 ============================================ Compress and decompress with SharpZipLib Compression (1000 times): 442 Compress and decompress with SharpZipLib Compression (long data 100 times): 26782

显而易见的,无论是长数据还是短数据的压缩与解压,System.IO.Compression中提供的方法都优于另外两种方法。

Zlib.net在速度上的劣势不明显,而同样的算法SharpZipLib要花两到三倍的时间。

总结

最终,不出所料的,微软官方提供的 System.IO.Compression 中的方法在速度上有着明显的优势;虽然不会提供Deflate的头尾信息,但可以想办法自己生成,而且这一缺点基本上是可以完全忽略的。 Zlib.net 虽然在速度上表现也不错,同时也会生成Deflate压缩的头尾信息,但因为其包装比较潦草,使用起来相对不方便。而 SharpZipLib 很可惜,虽然其他各方面都很方便,但速度上的缺陷相当致命,只能在一定需要 Deflate 而非 RawDeflate 或者使用的.Net Framework早于4.5的时候(且运行中时间消耗不重要)偷懒的用一用了。

参考与延申 关于Zlib

https://zlib.net/

关于 Deflate 和 Raw Deflate

https://stackoverflow.com/questions/37845440/net-deflatestream-vs-linux-zlib-difference
https://www.ietf.org/rfc/rfc1950.txt
https://www.ietf.org/rfc/rfc1951.txt

关于CSharp System.IO.Compression.DeflateStream

https://docs.microsoft.com/en-us/dotnet/api/system.io.compression.deflatestream?view=net-5.0

开发者之一 Mark Adler 在 StackOverflow 上的回答

deflate 和 compress 函数的区别

如何手动添加 header 和 trailer
https://stackoverflow.com/questions/39939869/data-format-for-system-io-compression-deflatestream

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxgyj.html