ホームページ >Java >&#&チュートリアル >Java 8 はメソッド参照をキャッシュしますか? それらのキャッシュを検討する必要があるのはどのような場合ですか?

Java 8 はメソッド参照をキャッシュしますか? それらのキャッシュを検討する必要があるのはどのような場合ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-30 06:42:11780ブラウズ

Does Java 8 Cache Method References and When Should You Consider Caching Them?

Java 8 でのメソッド リファレンス キャッシュ: 詳細な検討

概要

を使用する場合Java 8 のメソッド参照では、キャッシュの潜在的な利点に関して疑問が生じます。この記事では、メソッド参照をキャッシュすることの影響を検討し、それが有利になる場合についてのガイダンスを提供します。

呼び出しサイトとメソッド参照の実行の区別

区別することが重要ですステートレスまたはステートフル ラムダを使用した同じ呼び出しサイトの頻繁な実行と、異なるメソッドによる同じメソッドへのメソッド参照の頻繁な使用の間call-sites.

分析例

次の例を考えてみましょう:

Runnable r1 = null;
for (int i = 0; i < 2; i++) {
    Runnable r2 = System::gc;
    if (r1 == null) {
        r1 = r2;
    } else {
        System.out.println(r1 == r2 ? "shared" : "unshared");
    }
}

ここでは、同じ call-site が 2 回実行され、ステートレスなラムダであり、実装は「shared」を出力します。

Runnable r1 = null;
for (int i = 0; i < 2; i++) {
    Runnable r2 = Runtime.getRuntime()::gc;
    if (r1 == null) {
        r1 = r2;
    } else {
        System.out.println(r1 == r2 ? "shared" : "unshared");
        System.out.println(r1.getClass() == r2.getClass() ? "shared class" : "unshared class");
    }
}

これによりたとえば、同じ呼び出しサイトが 2 回実行され、ランタイム インスタンスへの参照を含むラムダが生成され、実装では「非共有」だが「共有クラス」と表示されます。

Runnable r1 = System::gc, r2 = System::gc;
System.out.println(r1 == r2 ? "shared" : "unshared");
System.out.println(r1.getClass() == r2.getClass() ? "shared class" : "unshared class");

対照的に、最後のこの例には、同等のメソッド参照を生成する 2 つの別個の呼び出しサイトが含まれていますが、Java 8.0.05 の時点では、「unshared」と「unshared」が出力されます。 class."

JVM の動作

Java 仮想マシン (JVM) は、メソッド参照の処理において重要な役割を果たします。これは、LambdaMetafactory の JRE ブートストラップ メソッドを参照する invokedynamic 命令を使用します。コンパイラは、ラムダ実装クラスの生成に必要な引数を提供します。

JVM には、最初の呼び出し時に形成された CallSite インスタンスを記憶して再利用する柔軟性があります。ステートレス ラムダと単一の呼び出しサイトの場合、JVM は通常、定数オブジェクトへの MethodHandle を含む ConstantCallSite を作成します。

一方、パラメータを持つラムダ (例: this::func) の場合、JVM はそれらをキャッシュしますが、パラメーターとラムダ インスタンス間のマップを維持する際に追加のオーバーヘッドが発生します。現在、JVM はそのようなラムダをキャッシュしません。この動作は、異なる呼び出しサイトによって作成された同じターゲット メソッドへのメソッド参照にも同様に適用されます。

キャッシュに関する考慮事項

前述の点に基づいて、メソッド参照のキャッシュにより、次のような結果が得られる可能性があります。結果は異なりますが、必ずしもパフォーマンスが向上するとは限りません。キャッシュ メカニズムを実装する前に、パフォーマンスへの影響を測定する必要があります。キャッシュが有益となる特定のケースがあります:

  • 複数の呼び出しサイトが同じメソッドを参照する場合
  • コンストラクター/クラスの初期化でラムダが作成される場合
  • 使用サイトが複数で同時に実行される場合スレッド
  • 最初のラムダ呼び出しのパフォーマンスが低い場合懸念事項

結論

メソッド参照のキャッシュは、特定のシナリオでは最適化手法となる可能性があります。ただし、キャッシュするかどうかは、コードと特定のパフォーマンス要件の慎重な分析に基づいて決定する必要があります。 JVM によるメソッド参照の処理は、Java 8 でラムダとメソッド参照の使用を最適化するための強固な基盤を提供します。

以上がJava 8 はメソッド参照をキャッシュしますか? それらのキャッシュを検討する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。