binaryflavor.com

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

실험

  • 테스트 데이터 : Lorem ipsum 텍스트를 100,000번 반복한 약 2.1MB 데이터를 사용했다. 압축 알고리즘이 패턴을 찾기 쉬운 반복적인 텍스트다.
    • Snappy: Google의 빠른 압축
    • LZ4: Fast, High, Level 1/3/6/9/12/17 총 8가지 변형
    • Gzip: 전통적인 압축
    • Brotli: Google의 웹 압축
    • Zstd: Facebook의 최신 압축
  • 각 사용한 라이브러리는 아래와 같다.
    • Snappy: org.xerial.snappy:snappy-java:1.1.10.8
    • LZ4: org.lz4:lz4-java:1.8.0
    • Gzip: Java 표준 라이브러리 (java.util.zip)
    • Brotli: com.aayushatharva.brotli4j:brotli4j:1.16.0
    • Zstd: com.github.luben:zstd-jni:1.5.7-4

실험 방법

  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 - 가장 느림

결론

  • 속도가 중요하다면 LZ4가 최선의 선택이다.
  • 압축률이 중요하다면 Brotli가 최고지만 매우 느리다.
  • 균형을 원한다면 Zstd가 좋은 선택이다.
  • Snappy는 빠르지만 압축률이 현저히 떨어진다.
  • 반복적인 텍스트 데이터에서는 LZ4의 압축률이 생각보다 훌륭했다.

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

Furthermore…

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

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


comments powered by Disqus