
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:
Preset | Blok | Czas | Rozmiar skomp. | Współczynnik kompresji |
Standard | Solid | 7,5 min | 1,2GB | 78% |
Ultra | 64MB | 10,5 min | 0,88GB | 84% |
Zstandard (zstd)
Zstandard został przetestowany na wielu poziomach kompresji, zarówno ze słownikami, jak i bez nich:
Preset | Słownik | Czas | Rozmiar skomp. | Współczynnik kompresji |
19 | Nie | 34,5 min | 1,38GB | 74% |
16 | Tak | 14,5 min | 1,49GB | 72% |
12 | Tak | 3 min | 1,55GB | 71% |
6 | Tak | 1 min | 1,61GB | 70% |
3 | Tak | 0,5 min | 1,7GB | 69% |
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ń.