압축 알고리즘 성능 비교 실험 (Snappy / LZ4 / Gzip / Brotli / Zstd)

실험

실험 방법

  1. 웜업: 각 알고리즘을 1,000번 실행해 JVM을 최적화했다.
  2. 측정: 10,000번씩 압축과 해제를 반복해 평균 시간을 계산했다.
  3. 메트릭: 압축 시간, 해제 시간, 압축 크기, 압축률을 측정.

웜업이 왜 필요한가?

JVM은 처음 실행되는 코드를 인터프리터로 실행하다가, 자주 호출되는 메서드는 JIT(Just-In-Time) 컴파일러가 최적화된 네이티브 코드로 컴파일한다. 따라서 첫 번째 실행과 수천 번째 실행의 성능이 크게 다를 수 있다. 웜업 과정을 거쳐야 진짜 성능을 측정할 수 있다.

결과

최종 벤치마크 결과는 다음과 같다:

AlgorithmCompress(ms)Decompress(ms)Size(bytes)Ratio(%)
Snappy0.25330.3804995574.74%
LZ4-Fast0.13180.335886950.41%
LZ4-High0.13280.333086630.41%
LZ4-L10.13340.333886630.41%
LZ4-L30.13140.334186630.41%
LZ4-L60.13460.334486630.41%
LZ4-L90.14010.339786630.41%
LZ4-L120.13590.338386630.41%
LZ4-L170.13550.334986630.41%
Gzip6.62990.778154220.26%
Brotli11.64601.03722720.01%
Zstd0.24130.36974790.02%

** 원본은 2MB 텍스트.

압축률 순위 (좋은 순)

  1. Brotli: 0.01% - 가장 뛰어난 압축률
  2. Zstd: 0.02%
  3. Gzip: 0.26%
  4. LZ4 변형들: 0.41%
  5. Snappy: 4.74% - 가장 나쁜 압축률

속도 순위 (빠른 순)

  1. LZ4 변형들: ~0.13ms - 가장 빠른 압축
  2. Zstd: 0.24ms
  3. Snappy: 0.25ms
  4. Gzip: 6.63ms
  5. Brotli: 11.65ms - 가장 느림

결론

실제 사용시에는 데이터 특성과 요구사항에 따라 적절한 알고리즘을 선택해야 한다.

Furthermore…

https://github.com/byunjuneseok/lettuce-lz4-compression-codec

본인은 Lz4를 레디스에서 사용하고 싶기 때문에, 아래와 같은 패키지를 구현했다. Lettuce Redis LZ4 압축 코덱은 maven 저장소에서 사용할 수 있게 해두었다.