4P by GN⁺ 16일전 | ★ favorite | 댓글 1개
  • 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 → 동적 라이브러리로 컴파일 후 사용 가능
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보다 빠르다"는 것은 없음