ホームページ >Java >&#&チュートリアル >Java 8 でメソッド参照をキャッシュするとパフォーマンス上の利点が得られるのはどのような場合ですか?

Java 8 でメソッド参照をキャッシュするとパフォーマンス上の利点が得られるのはどのような場合ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-29 21:26:09887ブラウズ

When Does Caching Method References in Java 8 Offer Performance Benefits?

Java 8 ではメソッド参照の保持は有益ですか?

次のコード スニペットを考えてみましょう:

class Foo {
   Y func(X x) {...} 

   void doSomethingWithAFunc(Function<X,Y> f){...}

   void hotFunction(){
        doSomethingWithAFunc(this::func);
   }
}

hotFunction が繰り返し呼び出される場合、キャッシュは行われます。 this::func は有益かもしれません。

class Foo {
     Function<X,Y> f = this::func;
     ...
     void hotFunction(){
        doSomethingWithAFunc(f);
     }
}

仮想通常、マシンはメソッド参照の匿名オブジェクトを作成するため、参照をキャッシュするとオブジェクトが 1 回作成されますが、キャッシュされていないバージョンでは hotFunction が呼び出されるたびにオブジェクトが作成されます。

ただし、違いは同じ呼び出しを実行する頻度にあります。

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");
}

同じ呼び出しサイトはステートレス ラムダを生成し、 JVM は「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");
  }
}

このシナリオでは、同じ呼び出しサイトがランタイム インスタンスへの参照を含むラムダを生成し、JVM は「unshared」と「shared class」を出力します。

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 つの異なる呼び出しサイトが同じメソッド参照を生成しますが、JVM は「unshared」と「unshared」を出力します。 class."

JVM は、最初の呼び出し時に作成された呼び出しサイト インスタンスを記憶し、再利用します。ステートレス ラムダと単一呼び出しサイトの場合、定数オブジェクトが生成されます。 JVM は呼び出しサイト間でメソッド参照を共有できますが、現在の実装では共有できません。

キャッシュは次の場合に有益である可能性があります:

  • 多数の個別の呼び出しサイト参照
  • ラムダはコンストラクター/クラスの初期化でインスタンス化され、複数のスレッドで使用されます。
  • 最初の呼び出しによりパフォーマンスが低下しました。

以上がJava 8 でメソッド参照をキャッシュするとパフォーマンス上の利点が得られるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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