.NET中最快的GZIP解压缩库

哪个.NET库具有最快的解压缩性能(就吞吐量而言)?

那里有不少图书馆……

  • GZipStream
  • DotNetZip
  • Xceed Zip for .NET
  • SevenZipLib
  • SharpZipLib | Xceed Zip for .NET的社区赞助商

……我希望还有更多我没有列出的。

有没有人看过这些GZIP库的吞吐量性能基准? 我对减压吞吐量很感兴趣,但我也希望看到压缩的结果。

对于非常大的文件,我已经使用SevenZipLib获得了良好的性能,但我使用的是原生7zip格式和高度可压缩的内容。 如果您使用的内容压缩率不高,那么与您可以为这些库找到的某些基准测试相比,您的吞吐量会有很大差异。

我发现Microsoft的GZipStream实现无法读取某些gzip文件的问题,所以我一直在测试一些库。

这是我适应的基本测试,可以运行,调整和决定:

 using System; using System.Diagnostics; using System.IO; using System.IO.Compression; using NUnit.Framework; using Ionic.Zlib; using ICSharpCode.SharpZipLib.GZip; namespace ZipTests { [TestFixture] public class ZipTests { MemoryStream input, compressed, decompressed; Stream compressor; int inputSize; Stopwatch timer; public ZipTests() { string testFile = "TestFile.pdf"; using(var file = File.OpenRead(testFile)) { inputSize = (int)file.Length; Console.WriteLine("Reading " + inputSize + " from " + testFile); var ms = new MemoryStream(inputSize); file.Read(ms.GetBuffer(), 0, inputSize); ms.Position = 0; input = ms; } compressed = new MemoryStream(); } void StartCompression() { Console.WriteLine("Using " + compressor.GetType() + ":"); GC.Collect(2, GCCollectionMode.Forced); // Start fresh timer = Stopwatch.StartNew(); } public void EndCompression() { timer.Stop(); Console.WriteLine(" took " + timer.Elapsed + " to compress " + inputSize.ToString("#,0") + " bytes into " + compressed.Length.ToString("#,0")); decompressed = new MemoryStream(inputSize); compressed.Position = 0; // Rewind! timer.Restart(); } public void AfterDecompression() { timer.Stop(); Console.WriteLine(" then " + timer.Elapsed + " to decompress."); Assert.AreEqual(inputSize, decompressed.Length); Assert.AreEqual(input.GetBuffer(), decompressed.GetBuffer()); input.Dispose(); compressed.Dispose(); decompressed.Dispose(); } [Test] public void TestGZipStream() { compressor = new System.IO.Compression.GZipStream(compressed, System.IO.Compression.CompressionMode.Compress, true); StartCompression(); compressor.Write(input.GetBuffer(), 0, inputSize); compressor.Close(); EndCompression(); var decompressor = new System.IO.Compression.GZipStream(compressed, System.IO.Compression.CompressionMode.Decompress, true); decompressor.CopyTo(decompressed); AfterDecompression(); } [Test] public void TestDotNetZip() { compressor = new Ionic.Zlib.GZipStream(compressed, Ionic.Zlib.CompressionMode.Compress, true); StartCompression(); compressor.Write(input.GetBuffer(), 0, inputSize); compressor.Close(); EndCompression(); var decompressor = new Ionic.Zlib.GZipStream(compressed, Ionic.Zlib.CompressionMode.Decompress, true); decompressor.CopyTo(decompressed); AfterDecompression(); } [Test] public void TestSharpZlib() { compressor = new ICSharpCode.SharpZipLib.GZip.GZipOutputStream(compressed) { IsStreamOwner = false }; StartCompression(); compressor.Write(input.GetBuffer(), 0, inputSize); compressor.Close(); EndCompression(); var decompressor = new ICSharpCode.SharpZipLib.GZip.GZipInputStream(compressed); decompressor.CopyTo(decompressed); AfterDecompression(); } static void Main() { Console.WriteLine("Running CLR version " + Environment.Version + " on " + Environment.OSVersion); Assert.AreEqual(1,1); // Preload NUnit new ZipTests().TestGZipStream(); new ZipTests().TestDotNetZip(); new ZipTests().TestSharpZlib(); } } } 

我目前正在运行的系统 (Linux 上的 Mono)的结果如下:

 Running Mono CLR version 4.0.30319.1 on Unix 3.2.0.29 Reading 37711561 from /home/agustin/Incoming/ZipTests/TestFile.pdf Using System.IO.Compression.GZipStream: took 00:00:03.3058572 to compress 37,711,561 bytes into 33,438,894 then 00:00:00.5331546 to decompress. Reading 37711561 from /home/agustin/Incoming/ZipTests/TestFile.pdf Using Ionic.Zlib.GZipStream: took 00:00:08.9531478 to compress 37,711,561 bytes into 33,437,891 then 00:00:01.8047543 to decompress. Reading 37711561 from /home/agustin/Incoming/ZipTests/TestFile.pdf Using ICSharpCode.SharpZipLib.GZip.GZipOutputStream: took 00:00:07.4982231 to compress 37,711,561 bytes into 33,431,962 then 00:00:02.4157496 to decompress. 

请注意,这是Mono的GZIP,微软的版本会给出自己的结果(正如我所提到的,只是无法处理你给它的任何gzip)

这是我在Windows系统上得到的:

 Running CLR version 4.0.30319.1 on Microsoft Windows NT 5.1.2600 Service Pack 3 Reading 37711561 from TestFile.pdf Using System.IO.Compression.GZipStream: took 00:00:03.3557061 to compress 37.711.561 bytes into 36.228.969 then 00:00:00.7079438 to decompress. Reading 37711561 from TestFile.pdf Using Ionic.Zlib.GZipStream: took 00:00:23.4180958 to compress 37.711.561 bytes into 33.437.891 then 00:00:03.5955664 to decompress. Reading 37711561 from TestFile.pdf Using ICSharpCode.SharpZipLib.GZip.GZipOutputStream: took 00:00:09.9157130 to compress 37.711.561 bytes into 33.431.962 then 00:00:03.0983499 to decompress. 

添加更多测试很容易……

压缩性能基准根据压缩流的大小和精确内容而有所不同。 如果这对您来说是一个特别重要的性能瓶颈,那么使用每个库编写一个示例应用程序并使用您的真实文件运行测试是值得的。