- zlib-rs는 데이터 압축을 위한 Rust 기반의 zlib 구현체로 최근 0.4.2가 출시되며 크게 성능 향상
- 현재 가장 빠른 API 호환 zlib 구현체이며, 특히 압축 해제 성능에서 경쟁 제품보다 뛰어남
- 주요 성능 개선 사항: 런타임에서 최적의 SIMD 구현을 자동 선택, DFA 최적화 등 적용
멀티버전 처리 (Multiversioning)
- 런타임에서 CPU에 따라 가장 빠른 함수 버전을 자동 선택
- Rust에서는 기본적으로 멀티버전 지원이 없어서 수동으로 구현해야 함
- 코드의 런타임 오버헤드를 최소화하면서 최적 성능 제공
DFA 최적화 (Deterministic Finite Automata)
- C 언어는
switch구문에서 암묵적 폴스루(fallthrough)를 사용해 성능 향상 - Rust에는 이와 유사한 메커니즘이 없어 성능 저하 발생
- LLVM의
-Cllvm-args=-enable-dfa-jump-thread옵션 적용 → 성능 회복 - LLVM 기본 설정에는 포함되지 않았지만 향후 Rustc에서 기본 활성화 예정
벤치마크 성능 비교
1. zlib-ng 대비 성능 비교
- zlib-rs는 대부분의 입력 크기에서 zlib-ng보다 빠른 성능을 보임
- 특히 1KB 입력에서는 약 10% 빠르고, 65KB 입력에서는 약 6% 빠름
- 가장 작은 입력 크기에서는 약간 뒤처지지만, 일반적으로는 성능 우위
예를 들어:
- 입력 크기가 4바이트일 때는 zlib-ng가 약간 빠르지만, 실사용에서는 영향이 적음
- 입력 크기가 1KB일 때 zlib-rs가 약 10% 더 빠름
- 입력 크기가 65KB일 때 zlib-rs가 약 6% 더 빠름
→ zlib-ng 대비 대형 청크에서 확실한 성능 우위
2. zlib-chromium 대비 성능 비교
- 소형 청크에서는 zlib-chromium이 빠름
- 하지만 대형 청크에서는 zlib-rs가 우위
- 일반적인 크기의 입력에서 zlib-rs가 더 좋은 성능 제공
예를 들어:
- 입력 크기가 4바이트일 때 zlib-chromium이 약 12% 더 빠름
- 입력 크기가 16바이트일 때 zlib-chromium이 약 6% 더 빠름
- 입력 크기가 1KB 이상일 때 zlib-rs가 성능 우위
→ 일반적인 크기에서 zlib-rs 성능 우위
압축 성능 비교
- 압축 성능에서는 개선 중이나 혼합된 결과
- 기본 압축 수준(6)에서 6% 향상, 최고 압축 수준(9)에서 13% 성능 향상
- 다른 압축 수준에서는 아직 zlib-ng가 빠름
예를 들어:
- 압축 수준 6에서 zlib-rs는 zlib-ng보다 약 6% 빠름
- 압축 수준 9에서 zlib-rs는 zlib-ng보다 약 13% 빠름
- 하지만 압축 수준 1~4에서는 zlib-ng가 우위
결론
- zlib-rs는 압축 해제 성능에서 zlib-ng, zlib-chromium 대비 성능 우위
- 압축 성능은 개선 중이며, 주요 압축 수준에서 유의미한 성능 향상 보임
- Rust 및 C 프로젝트 모두에 사용 가능
- Rust →
flate2크레이트에서zlib-rs플래그 사용 - C → 동적 라이브러리로 컴파일 후 사용 가능
- Rust →