3 ポイント 投稿者 GN⁺ 2025-06-19 | まだコメントはありません。 | WhatsAppで共有
  • bzip2 crate 0.6.0 は、bzip2 アルゴリズムの Rust 実装である libbz2-rs-sys をデフォルトとして採用し、C 依存を取り除くことで、速度とクロスコンパイルのしやすさを同時に改善
  • bzip2 は利用頻度が下がった古いアルゴリズムだが、複数の プロトコルやライブラリ が仕様準拠のため今なおサポートを必要としており、依存関係ツリーの深い場所に残っている
  • Rust 実装は圧縮で C と比べて約 9.66〜14.87% 少ない CPU サイクルを使用し、展開でもテスト全体で 4.48〜10.00% 改善
  • C を排除したことで WebAssembly、Windows、Android ビルドが簡単になり、デフォルトで libbz2-rs-sys シンボルを公開しないため、他の依存関係との シンボル衝突 のリスクも低減
  • 監査では off-by-one のロジックバグ 1 件と一部のファザー制限が修正され、bzip2 を使う上位ライブラリやアプリケーションも MIRI で実行可能に

bzip2 0.6.0 のデフォルト実装変更

  • bzip2 crate 0.6.0 は、bzip2 アルゴリズムの Rust 実装である libbz2-rs-sys をデフォルトで使用
  • 既存の C 依存を除去したことで、bzip2 crate はより高速になり、クロスコンパイル もしやすくなった
  • libbz2-rs-sys crate は、C プロジェクトでも改善効果を活用できるよう C 動的ライブラリ としてビルド可能
  • bzip2 は今日では利用量が多くないが、多くのプロトコルやライブラリが仕様準拠のため引き続きサポートする必要があり、複数のプロジェクトの依存関係ツリーの深部に残っている
  • 実装の詳細は以前の記事 Translating bzip2 with c2rust で確認できる

性能改善の結果

  • Rust 実装は一般に C 実装より高速で、一部のケースでは C 性能とほぼ同等
    • 確認されている範囲では、実質的に遅いケース はない
  • 圧縮ベンチマークでは C と比べて CPU サイクルが減少
    • sample3.ref level 1: 38.51M33.53M, -14.87%
    • silesia-small.tar level 1: 3.43G3.00G, -14.30%
    • silesia-small.tar level 9: 3.47G3.17G, -9.66%
    • bzip2 の level は作業メモリ使用量を意味し、性能には大きな影響を与えない
    • sample3.ref は level 1 だけでもファイルサイズを超えるメモリを割り当てるため、より高い level は関連性が低い
  • 展開性能もテスト全体で改善
    • sample3.bz2: -4.48%
    • sample1.bz2: -8.63%
    • sample2.bz2: -7.67%
    • dancing-color.ps.bz2: -5.17%
    • re2-exhaustive.txt.bz2: -7.65%
    • zip64support.tar.bz2: -10.00%
  • macOS のベンチマークマシンでは、展開性能の数値がときどき低く出ることがある
    • 原因は確認されておらず、macOS では perf のように性能追跡を自動化できるツールを動かしにくかった

ビルドとシンボル衝突の緩和

  • C 依存のある Rust プロジェクトのクロスコンパイルは cc crate のおかげですぐ動くことも多いが、失敗するとエラーのデバッグが難しい場合がある
    • システムライブラリのリンクも混乱しやすく、再現しにくい問題を生むことがある
    • bzip2 の WebAssembly コンパイルには以前から問題があった
    • C 依存を排除して Rust コードのみを使うことで、WebAssembly、Windows、Android ビルドが動作しやすくなった
  • libbz2-rs-sys はデフォルトで シンボルを export しない
    • C 依存を使う場合、Rust の extern ブロックが見つけられるようシンボルを export する必要がある
    • export された名前は、他の依存関係が同じシンボルを宣言したときに衝突する可能性がある
    • Rust プロジェクトでシンボル export が必要な場合は、機能フラグで有効化できる

検証と監査結果

  • 性能を出す bzip2 実装には一部 unsafe コード が必要で、C インターフェースを Rust で再現するにはさらに多くの unsafe コードが入る
    • そのコードは MIRI で実行可能
    • bzip2 を使う高水準ライブラリやアプリケーションも、いまでは MIRI で実行できる
  • 監査では off-by-one のロジックバグ 1 件が見つかり、一部のファザー制限が修正された
  • 今回の作業は、bzip2 crate のメンテナーである Alex Crichton、監査と専門知識を提供した Radically Open Securitye-Commons Fund を通じて資金支援した NLnet Foundation の協力を受けた

まだコメントはありません。

まだコメントはありません。