zstd vs zip vs 7-Zip (LZMA2): Benchmark kompresji .NET

Wybór odpowiedniej metody kompresji może wydawać się prosty, choć jak okazuje się nie zawsze tak jest. Niedawno miałem okazję aby wybrać najlepszy sposób kompresji dla jednej z aplikacji .NET i w tym artykule chciałbym podzielić się moimi spostrzeżeniami. Mój benchmark porównywał trzy popularne metody kompresji: ZIP, 7-Zip z LZMA2 oraz algorytm Zstandard (zstd) od Facebooka.

Logo zstd

Dane testowe

Benchmark wykorzystywał rzeczywiste dane aplikacji .NET składające się z plików wyjściowych dotnet publish z naszych serwisów backendowych. Zestaw danych obejmował:

  • Rozmiar: 5,4GB nieskompresowanych danych. Wiele takich samych plików.
  • Zawartość: Mieszane wyniki publish z self-contained=true i self-contained=false
  • Struktura: Wiele katalogów z typowymi artefaktami wdrożenia .NET
  • Fokus testów: Tylko kompresja (szybkość dekompresji nie była mierzona)

To reprezentuje realistyczny scenariusz dla deweloperów pracujących z wdrożeniami aplikacji .NET, pipeline’ami CI/CD i przechowywaniem artefaktów.

Wyniki benchmarku

Kompresja ZIP

CzasRozmiar skomp.Współczynnik kompresji
5 min1,8GB67%

Standardowy format ZIP zapewnił przyzwoitą kompresję z rozsądną szybkością, służąc jako punkt odniesienia dla porównań.

7-Zip (LZMA2)

Przetestowałem dwie różne konfiguracje algorytmu LZMA2 w 7-Zip:

PresetBlokCzasRozmiar skomp.Współczynnik kompresji
StandardSolid7,5 min1,2GB78%
Ultra64MB10,5 min0,88GB84%

Zstandard (zstd)

Zstandard został przetestowany na wielu poziomach kompresji, zarówno ze słownikami, jak i bez nich:

PresetSłownikCzasRozmiar skomp.Współczynnik kompresji
19Nie34,5 min1,38GB74%
16Tak14,5 min1,49GB72%
12Tak3 min1,55GB71%
6Tak1 min1,61GB70%
3Tak0,5 min1,7GB69%

Kluczowe wnioski

Efektywność kompresji

7-Zip okazał się wyraźnym zwycięzcą pod względem maksymalnego współczynnika kompresji. Preset Ultra osiągnął imponującą 84% redukcję rozmiaru, niemal zmniejszając o połowę wymagania dotyczące miejsca w porównaniu do ZIP. To było dla mnie zaskoczenie, spodziewałem się, że zstd będzie lepsze pod każdym względem, a okazało się, że w przypadku wielu takich samych plików (dll, cs, itp.) źródłowych, wynik może być zaskakujący.

Balans szybkości i współczynnika kompresji

Zstandard oferuje najlepszy stosunek szybkości do kompresji. Choć nie osiąga poziomów kompresji 7-Zip, zstd preset 6 ze słownikiem zapewnia 70% redukcję rozmiaru w zaledwie 1 minutę – co czyni go 7-10 razy szybszym niż 7-Zip przy podobnych rezultatach.

Malejące zyski w zstd

Wyższe presety zstd (16, 19) dramatycznie zwiększają czas kompresji, zapewniając jedynie marginalne poprawy w rozmiarze pliku. Punkt optymalny wydaje się znajdować przy presetach 3-6 dla większości praktycznych zastosowań.

Wydajność dekompresji

Choć nie była mierzona w tym benchmarku, warto zauważyć, że zstd zazwyczaj zapewnia 10x szybszą dekompresję niż 7-Zip, z szybkością dekompresji pozostającą stałą niezależnie od użytego poziomu kompresji. To czyni zstd szczególnie atrakcyjnym dla scenariuszy, gdzie pliki są kompresowane raz, ale dekompresowane często.

Praktyczne rekomendacje:

7-Zip (LZMA2) użyłbym gdy:

  • Koszt przechowywania jest krytyczny (cloud storage, długoterminowe archiwizowanie)
  • Czas kompresji nie stanowi ograniczenia (nocne buildy, przetwarzanie wsadowe)
  • Wymagany jest maksymalny współczynnik kompresji

zstandard użyłbym gdy:

  • Potrzebna jest zrównoważona wydajność (pipeline’y CI/CD, częste wdrożenia)
  • Szybka dekompresja jest ważna (wypakowywanie pakietów w runtime, częsty dostęp)
  • Akceptowalna jest umiarkowana kompresja z dobrą szybkością

ZIP użyłbym gdy:

  • Wymagana jest uniwersalna kompatybilność (cross-platform, systemy legacy)
  • Preferowane są proste narzędzia (wbudowana obsługa OS, minimalne zależności)
  • Wystarczająca kompresja ze standardowymi narzędziami

Zagadnienia implementacyjne

Dla deweloperów .NET pracujących z pipeline’ami wdrożeniowymi, rozważ te czynniki:

Integracja z pipeline’em buildowania: Szybkość Zstandard czyni go idealnym dla scenariuszy CI/CD, gdzie czas buildu bezpośrednio wpływa na produktywność deweloperów.

Obrazy kontenerów: Podczas budowania obrazów Dockera, wybór kompresji może znacząco wpłynąć zarówno na rozmiar obrazu, jak i czasy push/pull.

Dystrybucja pakietów: Jeśli Twoja aplikacja obejmuje dystrybucję pakietów, które są często pobierane i wypakowywane, szybka dekompresja zstd staje się znaczącą zaletą.

Podsumowanie

Benchmark wyraźnie pokazuje, że nie ma uniwersalnego rozwiązania. 7-Zip przewyższa w efektywności przechowywania, Zstandard zapewnia najlepszy balans szybkości i kompresji, podczas gdy ZIP pozostaje najbardziej uniwersalnie kompatybilną opcją.

Dla większości scenariuszy rozwoju .NET obejmujących częste cykle kompresji i dekompresji, Zstandard z presetami 3-6 oferuje optymalny balans, zapewniając znaczne oszczędności miejsca przy zachowaniu szybkości działania, która nie spowalnia workflow’ów deweloperskich.

Wybór ostatecznie zależy od Twoich konkretnych wymagań.

Dołącz do newslettera

Subskrybuj po bonusowe treści. Nie przegap nowych artykułów.

    We won’t send you spam. Unsubscribe at any time.

    Zostaw komentarz

    Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

    Przewijanie do góry