この記事では、一般的に使用されているいくつかの圧縮アルゴリズムのパフォーマンスを比較します。結果は、一部のアルゴリズムが極めて厳しい 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 つの落とし穴
常に注目度の高い人工知能分野に関連するアプリケーションは、常に大きな注目を集めています。人工知能は電...
近年、人工知能の継続的な発展とインテリジェント時代の静かな到来に伴い、顔認識に代表される生体認証技術...
近年、デジタル経済や市場、政策、テクノロジーなどのさまざまな要因に後押しされ、建設業界ではデジタル変...
近年、人工知能 (AI) はヘルスケア業界に変革をもたらす力となっています。 AI ベースのソフトウ...
人工知能 (AI)、機械学習 (ML)、ディープラーニング (DL) は、重複することが多く、混同さ...
MIT の調査によると、ディープラーニングは計算能力の限界に近づいているようです。 [[334431...
自動運転車の台頭により、都市の建設方法や都市環境における交通手段に対する考え方が一変するでしょう。 ...
[[246043]]アマゾンの機械学習チームは2014年以来、優秀な人材の求職活動をよりスマートにす...
著者 | 崔昊レビュー | Chonglou一般的なモデルは優れていますが、技術者は、独自の大規模な...
近年の科学技術の発展に伴い、企業サービスと企業は多くの反復的な労働と投資に直面していると思います。現...
最近、北京市自転車・電動自動車産業協会が主催した「第一回ターミナル配送インテリジェント交通サミットフ...
機械学習開発者として、あなたは多くの機械学習リソースに遭遇したことがあるかもしれません。今日は、オー...
網膜は人体の中で唯一、血管や神経細胞の変化を非侵襲的に直接観察できる組織であり、さまざまな慢性疾患の...
今年初めの Red Hat Summit で、Red Hat は OpenShift AI によるプ...