2010-07-20 7 views
10

Quelle bibliothèque .NET a les performances de décompression les plus rapides (en terme de débit)?La bibliothèque de décompression GZIP la plus rapide de .NET

Il y a assez peu de bibliothèques là-bas ...

... et je pense qu'il y en a plus que je n'ai pas listé.

Quelqu'un a-t-il vu un benchmark des performances de débit de ces bibliothèques GZIP? Je suis intéressé par le débit de décompression, mais j'aimerais voir les résultats pour la compression aussi.

+0

ont pas idée de repères que vous recherchez, mais il est est également SharpZipLib http://www.icsharpcode.net/OpenSource/SharpZipLib/ –

+0

Le 7-zip exécutable autonome est généralement vu comme étant en haut en termes de vitesse ... et SevenZipLib est simple d'un wrapper .Net, donc je J'y vais pour celui-là. Cependant, je n'ai pas de véritables repères. –

+1

Pourquoi est-ce important? C'est toujours une fraction du temps d'E/S nécessaire pour obtenir le flux. –

Répondre

2

J'ai eu de bonnes performances avec SevenZipLib pour les très gros fichiers, mais j'utilisais le format natif 7zip et un contenu hautement compressible. Si vous utilisez du contenu qui n'aura pas un taux de compression élevé, votre débit variera considérablement par rapport à certains des repères que vous pouvez trouver pour ces bibliothèques.

4

Les tests de performances de compression varient en fonction de la taille des flux compressés et du contenu précis. Si cela est un goulot d'étranglement particulièrement important pour votre performance, alors il vaut mieux écrire un exemple d'application utilisant chaque bibliothèque et exécuter des tests avec vos vrais fichiers.

+0

Exactement, les performances de compression varient en fonction du type de données en question. – Nate

10

J'ai trouvé des problèmes avec l'implémentation GZipStream de Microsoft ne pas être en mesure de lire certains fichiers gzip, donc j'ai testé quelques bibliothèques.

Ceci est un test de base je me suis adapté pour vous d'exécuter, tweak, et de décider:

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

Et le résultat dans le système que je suis actuellement (Mono sur Linux), est la suivante:

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. 

averti que c'est le GZIP de Mono, et la version de Microsoft donnera ses propres résultats (et comme je l'ai mentionné, ne peut pas gérer tout gzip que vous lui donnez)

C'est ce que je suis sur un système de fenêtres:

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. 

Il est assez facile d'ajouter d'autres tests ...

+0

pouvez-vous essayer sevenzipsharp http://sevenzipsharp.codeplex.com/ –

+0

System.IO.Compression semble très bien si nous regardons simplement les temps. Mais il semble moins si nous regardons les tailles produites. Ensuite, les deux mesures pourraient être atypiques et le résultat de votre entrée particulière. Cela ne nous en dit pas vraiment beaucoup ... –

Questions connexes