Zlib-rs는 C보다 빠름
(trifectatech.org)- 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 →
Hacker News 의견
-
Rust를 이미 알고 있다는 것을 알게 됨
- Rust의 목적이 안전성이라고 생각했지만, 이 라이브러리에는 unsafe 키워드가 많이 사용됨
- C와 Rust의 차이가 의미가 없어지는 시점이 언제인지 궁금함
- 인라인 어셈블리를 사용하면 두 언어 모두 같은 기계 코드를 생성할 수 있음
- Rust 컴파일러가 C 컴파일러보다 최적화가 더 잘 되는지 궁금함
-
"C보다 빠르다"는 다른 설계, 구현, 알고리즘 등으로 귀결됨
- 이미 존재하는 구현보다 빠를 수는 있지만, "C보다 빠르다"는 주장은 이상함
-
zippy in Nim이 zlib보다 1.5배에서 2배 빠르다고 주장함
- C에서 표준 설치보다 빠른 zlib도 존재함
- zlib은 요즘 구식이지만 여전히 인기가 있음
- 새로운 병렬 친화적 포맷의 기반으로 사용됨
-
Rust의 성능이 Rust 자체와 관련이 있는지, 아니면 다른 C 언어 버전보다 더 최적화된 것인지 궁금함
- C++가 C보다 consistently 더 나은 성능을 발휘하는 정렬의 경우가 있음
- Rust와 C 사이에도 비슷한 것이 있는지 궁금함
-
Chromium은 표준에 있는 알고리즘 때문에 zlib을 사용함
- 더 나은 알고리즘을 선택하면 더 나은 성능을 낼 수 있음
- Zstandard는 더 빠르고 압축도 더 잘됨
- LZ4는 훨씬 빠르지만 크기는 작지 않음
-
Zstandard와 blake3 다이제스트가 허용됨
-
Rust는 C만큼 빠르다고 말하는 것이 더 정확함
- 여전히 큰 성과임
-
어떤 라이브러리가 더 빠르게 컴파일되는지
- 어떤 라이브러리가 더 적은 종속성을 가지는지
- 각 라이브러리의 크기가 같은지, 어떤 것이 더 작은지
-
Rust 사용자들은 Rust와 C를 비교하는 것을 좋아하지만, C 사용자들은 C와 Rust를 비교하는 경우가 드뭄
-
컴파일된 시스템 언어를 다룰 때 언어는 속도에 거의 영향을 미치지 않음
- 최적화된 버전은 할당을 제어하고, 좋은 메모리 접근 패턴을 사용하며, SIMD와 멀티스레딩을 사용하여 쉽게 100배 이상 빠를 수 있음
- 더 나은 메모리 접근만으로도 프로그램 속도를 20배 이상 높일 수 있음
-
구현이 C에서보다 빠르다는 의미임
- "C보다 빠르다"는 것은 없음