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 →
1件のコメント
Hacker Newsの意見
すでにRustを知っていることが分かった
unsafeキーワードが多用されている「Cより速い」は、結局のところ設計、実装、アルゴリズムなどの違いに帰着する
Nimのzippyはzlibより1.5倍から2倍速いと主張している
Rustの性能がRust自体に関係しているのか、それとも他のC言語版より最適化されているだけなのか気になる
Chromiumは標準で定められたアルゴリズムのためにzlibを使っている
Zstandardとblake3ダイジェストは許可されている
RustはCより速いと言うより、Cと同じくらい速いと言うほうが正確
どのライブラリのほうがコンパイルが速いのか
RustユーザーはRustとCを比較するのが好きだが、CユーザーがCとRustを比較することはめったにない
コンパイル型システム言語を扱う場合、言語は速度にほとんど影響しない
実装がCのものより速いという意味である