Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

[erledigt] String Compress: Welche Variante ist perfomanter/besser?
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 622
Herkunft: Schweiz

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Diräkt am .
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von unconnected am .
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 426

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 622
Herkunft: Schweiz

Themenstarter:

beantworten | zitieren | melden

Hallo unconnected,
Hallo Sarc

Besten Dank für Eure Mitteilungen.
Zitat
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
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 426

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers