2010-07-20 18 views
10

Która biblioteka .NET ma najszybszą wydajność dekompresji (pod względem przepustowości)?Najszybsza biblioteka dekompresująca GZIP w .NET

Istnieje sporo bibliotek tam ...

... i spodziewam się, że nie ma ich więcej.

Czy ktoś widział wzorzec wydajności przepustowości tych bibliotek GZIP? Interesuje mnie przepustowość dekompresyjna, ale chciałbym zobaczyć również wyniki kompresji.

+0

nie mają pojęcia o benchmarkach szukasz, ale jest również SharpZipLib http://www.icsharpcode.net/OpenSource/SharpZipLib/ –

+0

Autonomiczny 7-zipowy plik wykonywalny jest zwykle postrzegany jako znajdujący się na samym szczycie pod względem prędkości ... i SevenZipLib jest prostym opakowaniem .Net tego, więc idę na to. Nie mam jednak prawdziwych benchmarków. –

+1

Dlaczego jest to ważne? Jest to zawsze ułamek czasu wejścia/wyjścia potrzebnego do uzyskania strumienia. –

Odpowiedz

2

Miałem dobrą wydajność z SevenZipLib dla bardzo dużych plików, ale używałem natywnego formatu 7zip i bardzo ściśliwej zawartości. Jeśli używasz treści, które nie mają wysokiego współczynnika kompresji, wtedy twoja przepustowość będzie się znacznie różnić w porównaniu do niektórych benchmarków, które możesz znaleźć dla tych bibliotek.

4

Testy wydajności kompresji różnią się w zależności od rozmiaru skompresowanych strumieni i dokładnej zawartości. Jeśli jest to dla ciebie szczególnie ważne wąskie gardło wydajności, warto poświęcić czas na napisanie przykładowej aplikacji z wykorzystaniem każdej biblioteki i wykonanie testów z prawdziwymi plikami.

+0

Dokładnie, wydajność kompresji zależy od danego typu danych. – Nate

10

Znalazłem problemy z implementacją GZipStream Microsoftu, które nie były w stanie odczytać niektórych plików gzip, więc testowałem kilka bibliotek.

Jest to podstawowy test I dostosowany, aby uruchomić, uszczypnąć i zdecydować:

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(); 
     } 
    } 
} 

a wynik w systemie Jestem obecnie działa (Mono na Linux), przedstawia się następująco:

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. 

być ostrzeżony, że jest to gZIP Mono, a wersja Microsoft doda swoje wyniki (i jak już wspomniałem, po prostu nie może obsługiwać dowolną gzip ją podać)

To co mam na systemie 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. 

Jest dosyć łatwo dodać więcej testów ...

+0

możesz spróbować sevenzipsharp http://sevenzipsharp.codeplex.com/ –

+0

System.IO.Compression wygląda całkiem dobrze, jeśli spojrzymy na czasy. Wygląda jednak mniej, jeśli spojrzymy na wyprodukowane rozmiary. Z drugiej strony, oba pomiary mogą być nietypowe i wynikają z danych wejściowych. To tak naprawdę nie mówi nam wiele ... –