Java 8式のパフォーマンス

Java 8のリリースに伴い、言語はラムダ式をサポートし始めましたが、2013年半ばに4年が経過し、多くの更新がリリースされ、Java 9が間もなく登場します(おそらく、一定の遅延)ので、時間の合流点で、Javaの新しいツールと世界のような古いツールのパフォーマンスを要約して評価し、定量的な評価を行いたいと思います。
socmetr.lambda.comparison
他の事柄がラムダ式の長所と短所について説明したように、パフォーマンス評価はすでに数回行われています。

最初のインクルード:
-コードの簡素化と削減
-機能的なスタイルを実装する可能性
-並列計算の可能性
第二に
-生産性の低下
-デバッグの難易度

ユーザーdmmmhttps://habrahabr.ru/post/146718/ )によって、5年前に優れた手法とテストが説明および使用され、それらが基礎として採用されました。

要するに、テスト自体がLambdaJプロジェクトで提供された場合dmmmはGuavaプロジェクトのテストを追加し、habr-community(2012)との議論の後に調整しました。

私(つまり、 blutovi )はすべてのラムダテストを書き直しました(テストはJavaのアルファバージョンで実行され、現在の状態ではコードをコンパイルできないため)。また、Java Mission Controlを使用してメモリステータスを分析し、テストごとにjfrファイルを添付しました結果で。 (JVM診断および監視ツールであるJava Mission Controlは、SunのHotSpotとOracleのJRockitの2つのJVMのアイデアを組み合わせた結果、java 7 update 40から利用可能になりました)。

どのようにテストされましたか?


junitテスト自体は、3つのフェーズで構成されます:収集の初期化、アイドル実行、統計収集による実行(時間計算は最後の段階でのみ実行され、メモリ操作の分析はサイクル全体で実行されます)。

時間測定は次のように実行されます。 z経時的な反復 Y、テストアルゴリズムの順次呼び出しが発生します。 有効期限が切れると、アルゴリズム実行の算術平均時間が決定されます  barYz

 barYz= frac1nz sumi=0nzYi

合計実行時間を分割することにより Y回数で n彼は何とかして成し遂げました。 に基づいて z繰り返し、アルゴリズムの合計平均実行時間を見つけます:

 barY= frac1z sumi=0z barYiz

大きさで z(反復回数)および Y(テストアルゴリズムが呼び出される時間)は、クラスch.lambdaj.demo.AbstractMeasurementTestの定数の値を変更することにより影響を受ける可能性があります。

public static final int WARMUP_ITERATIONS_COUNT = 10; public static final int ITERATIONS_COUNT = 10; public static final int ITERATION_DURATION_MSEC = 1000; 

テストは、Java Mission Controlの操作用にアクティブ化されたパラメーターを使用して実行され、診断ファイルの自動生成が許可されました。

結果


絶対的に (値が小さいほど良い
のために繰り返すグアバjdk8 lambda
時間、nsヒープMb時間、nsヒープMb時間、nsヒープMb時間、nsヒープMb
車の元のコストを抽出する220.4313200.6324188.1302266.2333
50k以上で購入した最年少の年齢6367260424527163672606157278
最年少の人の買い物を見つける60362706411.425962062606235288
最も購入した車を見つける2356167242317158821932971190
最も高価なセールを見つける497158.166431.6297196.182
買い手と売り手によるグループ販売1214425012053254825920618447242
ブランド別のインデックス車263.3289275.02972828226307.5278
すべてのブランドを印刷473.2355455.3365540.3281514.2337
フェラーリのすべての販売を選択199.366265.153210.4111200.265
コストで売上を並べ替える1075741075741069721566124
両方が男性の場合の合計費用67.06372.958215.988413.7114
相対的な用語で (100%がベースで、値が低いほど良い
のために繰り返すグアバjdk8 lambda
時間ヒープ時間ヒープ時間ヒープ時間ヒープ
車の元のコストを抽出する117%104%107%107%100%100%142%110%
50k以上で購入した最年少の年齢150%100%100%104%150%100%145%107%
最年少の人の買い物を見つける100%104%106%100%103%100%103%111%
最も購入した車を見つける100%100%103%102%250%116%126%114%
最も高価なセールを見つける100%108%119%100%881%450%400%124%
買い手と売り手によるグループ販売147%121%146%123%100%100%223%117%
ブランド別のインデックス車100%128%104%131%1074%100%117%123%
すべてのブランドを印刷104%126%100%130%119%100%113%120%
フェラーリのすべての販売を選択100%125%133%100%106%209%100%123%
コストで売上を並べ替える101%103%101%103%100%100%147%172%
両方が男性の場合の合計費用100%109%109%100%322%152%617%197%

結論


要約すると、ラムダ式を使用してさまざまな方法で同じことが実装できることに注意してください:ただし、パフォーマンスの最適なオプションであっても、単純なソリューションよりも劣り、最適なオプションではなく、パフォーマンスに大きな影響を与える可能性があります。

したがって、 反復アプローチにより、実行速度に焦点を当てることが可能になり、 グアバでは、 使用されるメモリの量に焦点を当てて、それを最小限に抑えることができます。 ラムダ式を使用すると、審美的な喜びだけが得られるようです(驚いたことに)。

テストを変更および改善する方法に関する提案を歓迎します。

参照資料


Source: https://habr.com/ru/post/J331030/


All Articles