4 ポイント 投稿者 GN⁺ 2025-03-17 | 1件のコメント | WhatsAppで共有
  • 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 → 動的ライブラリとしてコンパイルして利用可能

1件のコメント

 
GN⁺ 2025-03-17
Hacker Newsの意見
  • すでにRustを知っていることが分かった

    • Rustの目的は安全性だと思っていたが、このライブラリではunsafeキーワードが多用されている
    • CとRustの違いが意味をなさなくなるのはどの時点なのか気になる
    • インラインアセンブリを使えば、両言語とも同じ機械語コードを生成できる
    • RustコンパイラはCコンパイラより最適化がうまいのか気になる
  • 「Cより速い」は、結局のところ設計、実装、アルゴリズムなどの違いに帰着する

    • 既存の実装より速いことはあり得るが、「Cより速い」という主張は奇妙
  • Nimのzippyはzlibより1.5倍から2倍速いと主張している

    • Cにも標準インストール版より高速なzlibが存在する
    • zlibは今では古めかしいが、それでも依然として人気がある
    • 新しい並列向きフォーマットの基盤として使われている
  • Rustの性能がRust自体に関係しているのか、それとも他のC言語版より最適化されているだけなのか気になる

    • C++がCより一貫して高い性能を発揮するソートの例がある
    • RustとCの間にも似たようなことがあるのか気になる
  • Chromiumは標準で定められたアルゴリズムのためにzlibを使っている

    • より良いアルゴリズムを選べば、より良い性能を出せる
    • Zstandardはより高速で、圧縮率も高い
    • LZ4ははるかに高速だが、サイズは小さくならない
  • Zstandardとblake3ダイジェストは許可されている

  • RustはCより速いと言うより、Cと同じくらい速いと言うほうが正確

    • それでも大きな成果である
  • どのライブラリのほうがコンパイルが速いのか

    • どのライブラリのほうが依存関係が少ないのか
    • 各ライブラリのサイズは同じなのか、どちらが小さいのか
  • RustユーザーはRustとCを比較するのが好きだが、CユーザーがCとRustを比較することはめったにない

  • コンパイル型システム言語を扱う場合、言語は速度にほとんど影響しない

    • 最適化された版は割り当てを制御し、良いメモリアクセスパターンを使い、SIMDやマルチスレッドを使うことで、簡単に100倍以上速くなり得る
    • より良いメモリアクセスだけでも、プログラム速度を20倍以上向上させられる
  • 実装がCのものより速いという意味である

    • 「Cより速い」などというものはない