この記事では、一般的に使用されているいくつかの圧縮アルゴリズムのパフォーマンスを比較します。結果は、一部のアルゴリズムが極めて厳しい CPU 制約下でも適切に動作できることを示しています。 この記事で比較する計算は次のとおりです。
圧縮試験 どのファイルがデータ圧縮テストに適していて、どのファイルがほとんどの Java 開発者のコンピューターに存在するかを把握するのに、しばらく時間がかかりました (このテストを実行するためだけに、数百メガバイトのファイルを使用しなければならない状況にはしたくありません)。最後に、ほとんどの人は JDK ドキュメントをローカルにインストールしておくべきだと思いました。そこで、javadoc ディレクトリ全体を 1 つのファイルにマージし、すべてのファイルを連結することにしました。これは tar コマンドで簡単に実行できますが、誰もが Linux ユーザーであるとは限らないため、このファイルを生成するプログラムを作成しました。
私のマシン上のファイル全体のサイズは 354,509,602 バイト (338 MB) です。 テスト 最初は、ファイル全体をメモリに読み込んでから圧縮することを考えました。しかし、そうすると、4G マシンでもヒープ メモリ領域が簡単に使い果たされてしまうことが判明しました。 そこで、オペレーティング システムのファイル キャッシュを使用することにしました。ここで使用するテスト フレームワークは JMH です。このファイルは、ウォームアップ フェーズ中にオペレーティング システムによってキャッシュにロードされます (ウォームアップ フェーズ中に 2 回圧縮されます)。コンテンツを ByteArrayOutputStream に圧縮します (これが最速の方法ではないことは承知していますが、さまざまなテストではより安定しており、圧縮されたデータをディスクに書き込むのに時間がかかりません)。そのため、この出力を保存するためのメモリ領域も必要になります。 以下はテストクラスの基本クラスです。すべてのテストは圧縮された出力ストリームの実装のみが異なるため、この基本テスト クラスを再利用して、StreamFactory 実装からストリームを生成することができます。
これらのテスト ケースは非常に似ています (ソース コードは記事の最後にあります)。ここでは、JDK deflate のテスト クラスという 1 つの例のみを示します。
テスト結果 出力ファイルサイズ まず、出力ファイルのサイズを見てみましょう。 ||実装||ファイル サイズ (バイト)|| ||GZIP||64,200,201|| ||Snappy (通常)||138,250,196|| ||Snappy (フレーム)|| 101,470,113|| ||LZ4 (高速)|| 98,316,501|| ||LZ4 (高) ||82,076,909|| ||Deflate (lvl=1) ||78,369,711|| ||Deflate (lvl=2) ||75,261,711|| ||Deflate (lvl=3) ||73,240,781|| ||Deflate (lvl=4) ||68,090,059|| ||Deflate (lvl=5) ||65,699,810|| ||Deflate (レベル=6) ||64,200,191|| ||デフレート (レベル=7) ||64,013,638|| ||デフレート (レベル=8) ||63,845,758|| ||デフレート (レベル=9) ||63,839,200|| ファイル サイズは大きく異なることがわかります (60 MB から 131 MB)。さまざまな圧縮方法にかかる時間を見てみましょう。 圧縮時間 ||実装||圧縮時間 (ミリ秒)|| ||Snappy.framedOutput ||2264.700|| ||Snappy.normalOutput ||2201.120|| ||Lz4.testFastNative ||1056.326|| ||Lz4.testFastUnsafe ||1346.835|| ||Lz4.testFastSafe ||1917.929|| ||Lz4.testHighNative ||7489.958|| ||Lz4.testHighUnsafe ||10306.973|| ||Lz4.testHighSafe ||14413.622|| ||deflate (lvl=1) ||4522.644|| ||deflate (lvl=2) ||4726.477|| ||deflate (lvl=3) ||5081.934|| ||deflate (lvl=4) ||6739.450|| ||deflate (lvl=5) ||7896.572|| ||deflate (lvl=6) ||9783.701|| ||deflate (lvl=7) ||10731.761|| ||deflate (lvl=8) ||14760.361|| ||deflate (lvl=9) ||14878.364|| ||GZIP ||10351.887|| 圧縮時間とファイル サイズを表にまとめて、アルゴリズムのスループットを計算し、どのような結論を導き出せるかを確認します。 スループットと効率 ||実装||時間 (ミリ秒)||非圧縮ファイル サイズ||スループット (Mb/秒)||圧縮ファイル サイズ (Mb)|| ||Snappy.normalOutput ||2201.12 ||338 ||153.5581885586 ||131.8454742432|| ||Snappy.framedOutput ||2264.7 ||338 ||149.2471409017 ||96.7693328857|| ||Lz4.testFastNative ||1056.326 ||338 ||319.9769768045 ||93.7557220459|| ||Lz4.testFastSafe ||1917.929 ||338 ||176.2317583185 ||93.7557220459|| ||Lz4.testFastUnsafe ||1346.835 ||338 ||250.9587291688 ||93.7557220459|| ||Lz4.testHighNative ||7489.958 ||338 ||45.1270888301 ||78.2680511475|| ||Lz4.testHighSafe ||14413.622 ||338 ||23.4500391366 ||78.2680511475|| ||Lz4.testHighUnsafe ||10306.973 ||338 ||32.7933332124 ||78.2680511475|| ||deflate (レベル=1) ||4522.644 ||338 ||74.7350443679 ||74.7394561768|| ||deflate (レベル=2) ||4726.477 ||338 ||71.5120374012 ||71.7735290527|| ||deflate (レベル=3) ||5081.934 ||338 ||66.5101120951 ||69.8471069336|| ||deflate (レベル=4) ||6739.45 ||338 ||50.1524605124 ||64.9452209473|| ||デフレート (レベル=5) ||7896.572 ||338 ||42.8033835442 ||62.6564025879|| ||デフレート (レベル=6) ||9783.701 ||338 ||34.5472536415 ||61.2258911133|| ||デフレート (レベル=7) ||10731.761 ||338 ||31.4952969974 ||61.0446929932|| ||デフレート (レベル=8) ||14760.361 ||338 ||22.8991689295 ||60.8825683594|| ||deflate (lvl=9) ||14878.364 ||338 ||22.7175514727 ||60.8730316162|| ||GZIP ||10351.887 ||338 ||32.651051929 ||61.2258911133|| ご覧のとおり、実装のほとんどは非常に非効率的です。Xeon E5-2650 プロセッサでは、高レベルの deflate は約 23Mb/秒、GZIP でも 33Mb/秒に過ぎず、おそらく満足できるものではありません。一方、最も速いデフォールトアルゴリズムは約 75Mb/秒、Snappy は 150Mb/秒、LZ4 (高速、JNI 実装) は驚異的な 320Mb/秒に達します。 表から、現在 2 つの実装が不利であることがはっきりとわかります。Snappy は LZ4 (高速圧縮) よりも遅く、圧縮されたファイルは大きくなります。逆に、LZ4(高圧縮率)は、deflate レベル 1 ~ 4 よりも遅く、出力ファイルのサイズも deflate レベル 1 と比べて大幅に大きくなります。 したがって、「リアルタイム圧縮」が必要な場合は、LZ4 (高速) JNI 実装またはレベル 1 deflate のいずれかを選択することになります。もちろん、会社がサードパーティのライブラリの使用を許可していない場合は、deflate のみを使用できます。また、空き CPU リソースの量と圧縮データをどこに保存するかも考慮する必要があります。たとえば、圧縮されたデータを HDD に保存する場合、100 Mb/秒以上のパフォーマンスはまったく役に立ちません (ファイルが十分に大きいと仮定)。HDD の速度がボトルネックになります。同じファイルを SSD ハードドライブにエクスポートすると、LZ4 でも遅くなりすぎます。データをネットワークに送信する前に圧縮する場合は、LZ4 を選択するのが最適です。これは、deflate75Mb/秒の圧縮パフォーマンスが、ネットワークの 125Mb/秒のスループットに比べて非常に小さいためです (もちろん、ネットワーク トラフィックにもパケット ヘッダーがあることは承知していますが、それを考慮に入れても、ギャップは依然としてかなり大きいです)。 要約する
ソースコードJava 圧縮テスト ソースコード 元の記事は以下から転送されました: Java におけるさまざまな圧縮アルゴリズムのパフォーマンス比較 |
<<: 顔認識に興味がありますか? JavaScriptで実装された顔検出方法
>>: PaaS でフェイルオーバー アルゴリズムを作成する際に避けるべき 3 つの落とし穴
本日、北京市は有人自動運転試験を正式に開始した。北京経済技術開発区は40平方キロメートルのエリアを自...
[[421075]]この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載した...
生成 AI は統合の状況を変えています。 チームの経済性、速度、プロジェクト構造、配信モデルについて...
従業員にとってリモートワークが実現可能であることを示す証拠は豊富にあります。 Zoom や Micr...
5月15日、世界有数のIoTロック企業であるnokelockの製品発表会が北京金宇シェラトンホテルで...
現在、モノのインターネットの将来の発展方向は非常に明確であり、それが AIoT です。 AIは頭脳で...
受動的な収集は防御が難しい一部の学校では、この技術を搭載したカメラを使用して、生徒の授業状況を監視し...
自然言語処理 (NLP) モデルは人間の言語を理解できず、テキストを反対の意味として解釈しますが、こ...
人工知能研究チームOpenAIが発表した最新の報告書は、ロボットが自ら作成した新しい言語を使って互い...
C# データ構造とアルゴリズムの線形リストとは何ですか?まず、C# のデータ構造とアルゴリズムにおけ...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
[[402075]]序文Bisect は、リストをソートしたままリストに要素を挿入するアルゴリズムを...