【问题标题】:The fastest GZIP decompress library in .NET [closed].NET 中最快的 GZIP 解压缩库 [关闭]
【发布时间】:2012-08-03 23:48:12
【问题描述】:

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

那里有很多图书馆...

...我希望还有更多我没有列出。

有人看过这些 GZIP 库的吞吐量性能基准吗?我对解压缩吞吐量感兴趣,但我也想查看压缩结果。

【问题讨论】:

  • 不知道您正在寻找的基准,但也有 SharpZipLib icsharpcode.net/OpenSource/SharpZipLib
  • 为什么这很重要?它始终只是获取流所需的 I/O 时间的一小部分。
  • @Hans Passant: 这很重要,因为我需要解压缩 1000 个多 GB 文件。吞吐量不会是获取流所需的 I/O 时间的一小部分。
  • @j_random_hacker:我们有一个相当“宽”的 RAID 设置;每秒个位数千兆字节...足以让磁盘不必成为瓶颈。当我向外扩展时,我有点假设一个磁盘上最快的 GZIP 将是整个集群中最快的...
  • @Rudiger,仅读取文件并丢弃与读取、解压缩和丢弃之间的性能差异是什么?这将告诉您在这种情况下减压是否真的值得优化。

标签: c# .net performance zip gzip


【解决方案1】:

我发现 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,Microsoft 的版本会给出自己的结果(正如我提到的,只是无法处理你给它的任何 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.

添加更多测试很容易......

【讨论】:

  • 你可以试试sevenzipsharp sevenzipsharp.codeplex.com
  • System.IO.Compression 看起来不错,如果我们只看时间。但如果我们看看生产的尺寸,它看起来就不那么重要了。然后,这两个测量结果都可能是非典型的,并且是您的特定输入的结果。这并不能告诉我们太多...
【解决方案2】:

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

【讨论】:

  • 确切地说,压缩性能因相关数据类型而异。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2010-11-16
    • 2012-02-12
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多