ラムダ式のパフォーマンス: ヒープの割り当てとインスタンスの作成
Java 8 のラムダ構文を利用してコレクションを反復処理する場合、次のような共通の懸念が生じます。各ラムダ呼び出しはヒープ上に新しいオブジェクトを作成しますか?これは、匿名クラスを使用した従来の構文と同等ですか?
答え:
はい、いいえです。ラムダ式は機能的には匿名クラスと同等ですが、異なる実装動作を示します。
具体的には、値を取得しない (つまり、スコープ外の変数にアクセスしない) ラムダ式は、呼び出し間で再利用されるシングルトンになります。 。これは、毎回ヒープ上に新しいオブジェクトを作成するわけではないことを意味します。
ただし、ラムダ式が値をキャプチャする場合、実行のたびに新しいインスタンスが作成されます。 JVM の実装によって正確な動作が決まりますが、Oracle の JVM は現在、値を取得するラムダ用にシングルトンを作成し、非シングルトン用に複数のインスタンスをインスタンス化します。
ヒープ スペースとパフォーマンスへの影響:
シングルトンは、ヒープ領域の使用率を最適化します。これは、ラムダが実行されます。ただし、値を取得するラムダの場合、特に頻繁に使用する場合、複数のインスタンスが大量のヒープ領域を消費する可能性があります。
さらに、呼び出しごとに新しいインスタンスを作成すると、パフォーマンスが低下します。複雑なロジックを使用して値をキャプチャするラムダや、大きな変数をキャプチャする場合、パフォーマンスのオーバーヘッドが顕著になる可能性があります。
推奨事項:
ラムダ式を優先するか、従来の for ループを優先するかによって異なります。ラムダ式の性質について。シングルトンはパフォーマンス上の利点を提供しますが、値を取得するラムダではヒープ領域とパフォーマンスのコストが発生する可能性があります。大規模なマルチレベルのデータ構造の場合、パフォーマンスが重要な場合は、従来の for ループの方が適している可能性があります。
以上がJava 8 ラムダ式は常に新しいヒープ オブジェクトを作成しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。