2010-07-20 19 views
10

¿Qué biblioteca .NET tiene el rendimiento de descompresión más rápido (en términos de rendimiento)?La biblioteca de descompresión GZIP más rápida en .NET

Hay algunas bibliotecas bastantes por ahí ...

... y espero que haya más que no he enumerado.

¿Alguien ha visto un punto de referencia del rendimiento de rendimiento de estas bibliotecas GZIP? Estoy interesado en el rendimiento de descompresión, pero también me gustaría ver los resultados de la compresión.

+0

no tienen ninguna pista acerca de los puntos de referencia que usted está buscando, pero hay también es SharpZipLib http://www.icsharpcode.net/OpenSource/SharpZipLib/ –

+0

El ejecutable autónomo de 7-zip normalmente se ve como el más alto en términos de velocidad ... y SevenZipLib es una simple envoltura .Net, así que iré por ese. Sin embargo, no tengo puntos de referencia reales. –

+1

¿Por qué es esto importante? Siempre es una fracción del tiempo de E/S necesario para obtener la transmisión. –

Respuesta

2

He tenido un buen rendimiento con SevenZipLib para archivos muy grandes, pero estaba usando el formato 7zip nativo y contenido altamente compresible. Si está utilizando contenido que no tendrá una alta relación de compresión, su rendimiento variará mucho en comparación con algunos de los puntos de referencia que puede encontrar para estas bibliotecas.

4

Las pruebas de rendimiento de compresión varían en función del tamaño de las secuencias que se comprimen y el contenido preciso. Si este es un cuello de botella de rendimiento particularmente importante para usted, entonces valdría la pena su tiempo para escribir una aplicación de muestra usando cada biblioteca y ejecutar pruebas con sus archivos reales.

+0

Exactamente, el rendimiento de compresión varía según el tipo de datos en cuestión. – Nate

10

Encontré problemas con la implementación de GZipStream de Microsoft al no poder leer ciertos archivos gzip, así que he estado probando algunas bibliotecas.

Ésta es una prueba básica He adaptado para ejecutar, ajustar, y decidir:

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

Y el resultado en el sistema actualmente estoy corriendo (Mono en Linux), es el siguiente:

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. 

ser advertidos de que esto es gZIP de Mono, y la versión de Microsoft dará a sus propios resultados (y como he mencionado, simplemente no puede manejar cualquier gzip le das)

Esto es lo que tengo en un sistema 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. 

Es bastante fácil de agregar más pruebas ...

+0

puede probar sevenzipsharp http://sevenzipsharp.codeplex.com/ –

+0

System.IO.Compression se ve muy bien si solo miramos los tiempos. Pero parece menos si miramos los tamaños producidos. Entonces, de nuevo, ambas mediciones podrían ser atípicas y el resultado de su entrada particular. Esto realmente no nos dice mucho ... –

Cuestiones relacionadas