>_ DevTrendsja

言語

ホーム

言語

セクション

フロントエンド バックエンド モバイル DevOps AI / ML ゲーム開発 ブロックチェーン 組み込み セキュリティ
C

コードを書き直さずにデータ圧縮を4倍高速化する手法

90年代から使われてきたものをなぜ変えるのか

元のzlibライブラリは30年前に登場しました。Mark AdlerとJean-Loup Gaillyは、非常に信頼性が高く移植性の高いツールを作成しました。スマートウォッチからレガシーOSまで、ほとんどどこでも動作します。しかし、この汎用性には代償があります。

古いコンパイラや16ビット環境との互換性を維持するため、zlibのコードには多くの回避策が含まれています。メモリ制限のチェックや古いプロセッサ向けのマクロが溢れています。そのため、最新の開発者によるベクトル命令の新しい最適化をメインリポジトリに組み込むことができませんでした。Mark Adlerは高い安定性を維持しており、彼の考えは理解できます。

そこでHans Christian Rosbach(Dead2)は、蓄積されたコミュニティのパッチを1つのフォークにまとめることを決意しました。こうしてzlib-ngプロジェクトが誕生しました。

zlib-ngの内部で何が変わったか

このフォークの考え方はシンプルです。古いレガシーコードを削除し、最新のCPUのベクトル命令を適用します。開発者たちはIntelとCloudflareのパッチを採用し、90年代のサンプルを整理し、主要なアルゴリズムをC11で書き直しました。

結果は明白です。x86-64アーキテクチャでは、圧縮と解凍が標準のzlibの約4倍高速に動作します。

このパフォーマンス向上の要因:

  • 다양한 아키텍처용 벡터 명령어. AVX2, AVX-512, SSSE3(x86用)、NEON(ARM用)、およびPOWER、RISC-V、LoongArch、IBM Z用のベクトルユニットを活用。
  • 実行時の自動CPU機能検出. コンパイル済みバイナリ自体が、特定のプロセッサでどのベクトル化関数を呼び出すかを認識します。
  • 高速なdeflateアルゴリズム. Intelによる反復検索、ハッシュシフト、CRC32計算の最適化研究成果を活用。
  • 安全でないアライメントアクセス. アライメントされていないメモリの読み書きが最適化され、ビットバッファも更新されました。

同時に、このプロジェクトは既存の環境を壊そうとはしていません。標準のzlibと完全なAPI互換性を持たせてビルドすることも、独自の更新されたネイティブAPIを使用することもできます。

自分でビルドして試す方法

このプロジェクトには2つのビルドシステムがあります:CMakeと伝統的なconfigureです。

CMakeを使用する場合、ビルドはいつもの通りです:

パラメータは、古典的なzlibとの完全な互換性モードを有効にします。出力はシステムのと交換可能なライブラリです。

おなじみのビルドプロセスが好きなファンにとっては、也是一样です:

vcpkg依存関係マネージャーを使用する場合は、手動でソースを取得する必要がまったくありません:

LD_PRELOADでアプリケーションを高速化

zlib-ngで最も興味深いテクニックの1つは、コードを変更せずに既存のソフトウェアを高速化することです。プログラムが動的にリンクしている場合、実行時にライブラリを置き換えることができます。

ユーティリティを一時的な置換で起動する方法:

アプリケーションは、バイナリを変更せずに、プロセッサのベクトル命令をすぐに活用します。

ただし、フォークの作者はREADMEで明確に警告しています:Linuxのディレクトリでシステムのを置き換えることはしないでください。何か問題が発生したり、まれな非互換性が表面化したりすると、システム全体、特にシステムサービスがクラッシュします。安全のため、フォークをなどの別のディレクトリにインストールし、明示的にリンクすることをお勧めします。

テストによるコードカバレッジはどの程度か

データ圧縮を担当するコードは、失敗なく動作する必要があります。1ビットでも失うと、アーカイブはゴミになります。zlib-ngの作者たちはテストを真剣に取り組んでいます。

リポジトリでは包括的なチェックセットを採用しています:

  • OSS-Fuzzによるメモリサニタイザーとファジング。
  • QEMUによるARM、PowerPC、RISC-V、SPARC64、S390x向けネイティブおよびエミュレートCI。
  • Google Testベースのユニットテスト。
  • Google Benchmarkを使用したパフォーマンス測定。

継続的なファジング 덕분에、ライブラリは高い信頼性を維持しており、コアシステムコンポーネントを置き換える際に重要です。

誰がzlib-ngの恩恵を受けるか

まず第一に、データの圧縮と解凍がボトルネックになっているチームにとって、このフォークは役立ちます。ギガバイト単位のログを処理している場合、nginxのようなWebサーバーで動作している場合、ゲーム開発でテクスチャを圧縮している場合、またはバックエンドで大量のデータ処理をしている場合、zlib-ngは目に見える高速化をもたらします。

一方、ソフトウェアが古い16ビットマイクロコントローラーや完全に珍しい30年前のOSで動作している場合、実績のある元のzlibに触れる意味はありません。このフォークは最新のプラットフォーム向けに作られました。

このツールは成熟しており、コミュニティによって積極的にメンテナンスされています。最新のハードウェアで最大限のDEFLATEとgzipパフォーマンスが必要な場合は、数時間を費やして自分のデータでベンチマークを実行する価値があります。

関連プロジェクト