Java 8 でのメソッド参照のキャッシュ
Java 8 では、インスタンス メソッドとコンストラクターを参照するための簡潔な構文を提供するメソッド参照が導入されました。ただし、これらの参照をキャッシュすることが有益かどうかについては懸念があります。このトピックを理解するには、同じ呼び出しサイトを頻繁に実行するためにメソッド参照をキャッシュすることと、異なる呼び出しサイトでメソッド参照を複数回使用するためにメソッド参照をキャッシュすることを区別することが重要です。
メソッド参照のキャッシュ同じ呼び出しサイトの場合
Foo.func() が繰り返し呼び出される次のコードを考えてみましょう。 doSomethingWithAFunc():
class Foo { Y func(X x) {...} void doSomethingWithAFunc(Function<X,Y> f){...} void hotFunction(){ doSomethingWithAFunc(this::func); } }
this::func をキャッシュすると、hotFunction() が実行されるたびに新しい匿名クラス インスタンスが作成されなくなると考えられます。ただし、JVM は、ラムダの最初の呼び出し時に作成された呼び出しサイト インスタンスを再利用することで、このシナリオをすでに最適化しています。この場合、メソッド参照のキャッシュは不要です。
異なる呼び出しサイトのメソッド参照のキャッシュ
対照的に、次の例を考えてみましょう。
Runnable r1 = System::gc; Runnable r2 = System::gc;
ここでは、2 つの異なる呼び出しサイトが、java.lang.System 内の同じターゲット メソッド System.gc() へのメソッド参照を生成します。 JVM はそれらの間で単一のラムダ インスタンスを共有できますが、Java 8 の現在の実装では共有できません。これは、ラムダ インスタンスのキャッシュを維持することによるパフォーマンス上の利点が不確実であるためです。
ベスト プラクティス
これらの考慮事項を考慮すると、通常、メソッド参照をキャッシュすることは、次の場合を除き推奨されません。これらは、測定を通じて特定された特定のパフォーマンス上の懸念事項です。キャッシュはプログラムの実行動作を変更する可能性があるため、次の場合にのみ考慮する必要があります。
ラムダはコンストラクターまたはクラスの初期化で作成され、
以上がJava 8 のメソッド参照キャッシュによりパフォーマンスは向上しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。