Laden...

[erledigt] String Compress: Welche Variante ist perfomanter/besser?

Erstellt von Diräkt vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.083 Views
D
Diräkt Themenstarter:in
615 Beiträge seit 2009
vor 10 Jahren
[erledigt] String Compress: Welche Variante ist perfomanter/besser?

Hallo Leute 😃

Kann mir jemand sagen was perfomanter/besser ist ?
(Man nehme an beide Varianten geben Base65 oder UTF8 zurück (irrelevant))

**Variante 1 😗*



 private string CompressString(string inputString)
        {
            byte[] outputBytes = null;
            byte[] inputBytes = AsciiEncoding.GetBytes(inputString);

            using (var ms = new MemoryStream())
            {
                using (var zipStream = new GZipStream(ms, CompressionMode.Compress))
                {
                    zipStream.Write(inputBytes, 0, inputBytes.Length);
                }
                outputBytes = ms.ToArray();
            }

            return Convert.ToBase64String(AddDataCount(outputBytes, inputBytes.Length));
        }

        private string DecompressString(string inputString)
        {
            string outputString = String.Empty;
            byte[] inputBytes = Convert.FromBase64String(inputString);
            Int32 lengthDataArray = BitConverter.ToInt32(inputBytes, inputBytes.Length - LengthDataByteCount);
            var outputBytes = new byte[lengthDataArray];

            using (var ms = new MemoryStream(RemoveDataCount(inputBytes)))
            {
                using (var zipStream = new GZipStream(ms, CompressionMode.Decompress))
                {
                    zipStream.Read(outputBytes, 0, outputBytes.Length);
                }
                outputString = AsciiEncoding.GetString(outputBytes);
            }

            return outputString;
        }

**Variante 2 😗*

 public static byte[] Zip(string str)
        {
            var bytes = Encoding.UTF8.GetBytes(str);

            using (var msi = new MemoryStream(bytes))
            using (var mso = new MemoryStream())
            {
                using (var gs = new GZipStream(mso, CompressionMode.Compress))
                {
                    msi.CopyTo(gs);
                }

                return mso.ToArray();
            }
        }

        public static string Unzip(byte[] bytes)
        {
            using (var msi = new MemoryStream(bytes))
            using (var mso = new MemoryStream())
            {
                using (var gs = new GZipStream(msi, CompressionMode.Decompress))
                {
                    gs.CopyTo(mso);
                }

                return Encoding.UTF8.GetString(mso.ToArray());
            }
        }

Besten Dank und beste Grüsse

Diräkt

849 Beiträge seit 2006
vor 10 Jahren

Was hält Dich davon ab ein Performance Test zu machen?

Besser oder schlechter ist wohl Geschmackssache.. ich finde die untere übersichtlicher, obwohl da ja noch die Convertierung zu base64 fehlt im Vergleich zur oberen.

S
417 Beiträge seit 2008
vor 10 Jahren

Schliesse mich unconnected an. Mach nen Performance test, wenn es dir um die Performance geht.
Wenn es dir um das Datenvolumen geht, ist der Ansatz mit Base64 eher kontraproduktiv, da dadurch das Datenvolumen um etwa 1/3 erhöht wird.
Es kommt natürlich auch drauf an, in welchem Format du die komprimierten Daten dann speicherst (string, byte[] etc.). Wenn es ein string sein muss, dann wäre Base64 die option.

D
Diräkt Themenstarter:in
615 Beiträge seit 2009
vor 10 Jahren

Hallo unconnected,
Hallo Sarc

Besten Dank für Eure Mitteilungen.

Mach nen Performance test, wenn es dir um die Performance geht.

Damit ich nicht Äpfel mit Birnen vergleiche habe ich beides getestet :

=> Test 1:

Beide Compress methoden geben ein String zurück, 10'000 Compress ; Decompress:

Variante 1 :

10'000 Tests => 00:00:00.3196391

Variante 2 :

10'000 Tests => 00:00:00.4225765

=> Test 2:

Beide Compress methoden geben ein byte[] zurück, 10'000 Compress ; Decompress:

Variante 1 :

10'000 Tests => 00:00:00.3111186

Variante 2 :

10'000 Tests => 00:00:00.4206573

Somit werde ich wohl Variante 1 benutzen 😃 (die mit byte[] so aussieht:)


private byte[] CompressString(string inputString)
        {
            byte[] outputBytes = null;
            byte[] inputBytes = AsciiEncoding.GetBytes(inputString);

            using (var ms = new MemoryStream())
            {
                using (var zipStream = new GZipStream(ms, CompressionMode.Compress))
                {
                    zipStream.Write(inputBytes, 0, inputBytes.Length);
                }
                outputBytes = ms.ToArray();
            }

            return outputBytes;
        }

        private string DecompressString(byte[] inputBytes)
        {
            string outputString = String.Empty;
            Int32 lengthDataArray = BitConverter.ToInt32(inputBytes, inputBytes.Length - LengthDataByteCount);
            var outputBytes = new byte[lengthDataArray];

            using (var ms = new MemoryStream(inputBytes))
            {
                using (var zipStream = new GZipStream(ms, CompressionMode.Decompress))
                {
                    zipStream.Read(outputBytes, 0, outputBytes.Length);
                }
                outputString = AsciiEncoding.GetString(outputBytes);
            }

            return outputString;
        }

Beste Grüsse

Diräkt

S
417 Beiträge seit 2008
vor 10 Jahren

Wenn es dir rein um Performance geht, solltest du den DeflateStream im Vergleich zum GZipStream untersuchen. Die Compression beim DeflateStream scheint deutlich schneller zu sein: GZip vs. Deflate - Compression and Performance