Benchmark kompresji: ZIP vs 7-Zip (LZMA2) vs zstd

Podczas optymalizacji pipeline’ów wdrożeniowych i przechowywania aplikacji .NET, wybór odpowiedniego algorytmu kompresji może znacząco wpłynąć zarówno na koszty przechowywania, jak i szybkość wdrażania. Niedawno przeprowadziłem kompleksowy benchmark porównujący trzy popularne metody kompresji: ZIP, 7-Zip z LZMA2 oraz algorytm Zstandard (zstd) od Facebooka.

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

  • Czas: 5 minut
  • Rozmiar skompresowany: 1,8GB
  • Współczynnik kompresji: 67% redukcji rozmiaru

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ń.

Zostaw komentarz

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

Przewijanie do góry