Table of Contents
Is Preserving Method References Beneficial in Java 8?
Home Java javaTutorial When Does Caching Method References in Java 8 Offer Performance Benefits?

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

Nov 29, 2024 pm 09:26 PM

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

Is Preserving Method References Beneficial in Java 8?

Consider the following code snippet:

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

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

   void hotFunction(){
        doSomethingWithAFunc(this::func);
   }
}
Copy after login

If the hotFunction is called repeatedly, caching this::func may be beneficial.

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

Virtual Machines typically create anonymous objects for method references, so caching the reference creates the object once, while the uncached version creates it each time hotFunction is invoked.

However, the distinction lies in the frequency of executing the same call-site and using a method-reference to the same method from different 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");
}
Copy after login

The same call-site produces a stateless lambda, and the JVM prints "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");
  }
}
Copy after login

In this scenario, the same call-site produces a lambda with a reference to a Runtime instance, and the JVM prints "unshared" and "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");
Copy after login

Two distinct call-sites produce the same method reference, but the JVM prints "unshared" and "unshared class."

The JVM remembers and reuses call-site instances created on the first invocation. For stateless lambdas and single call-sites, it produces a constant object. The JVM is allowed to share method references between call-sites, but the current implementation does not.

Caching may be beneficial in the following cases:

  • Numerous distinct call-sites refer to the same method.
  • The lambda is instantiated in a constructor/class initialization and used by multiple threads concurrently.
  • The first invocation has reduced performance.

The above is the detailed content of When Does Caching Method References in Java 8 Offer Performance Benefits?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot Article

Hot Article

Hot Article Tags

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How does Java's classloading mechanism work, including different classloaders and their delegation models? How does Java's classloading mechanism work, including different classloaders and their delegation models? Mar 17, 2025 pm 05:35 PM

How does Java's classloading mechanism work, including different classloaders and their delegation models?

Top 4 JavaScript Frameworks in 2025: React, Angular, Vue, Svelte Top 4 JavaScript Frameworks in 2025: React, Angular, Vue, Svelte Mar 07, 2025 pm 06:09 PM

Top 4 JavaScript Frameworks in 2025: React, Angular, Vue, Svelte

How do I use Maven or Gradle for advanced Java project management, build automation, and dependency resolution? How do I use Maven or Gradle for advanced Java project management, build automation, and dependency resolution? Mar 17, 2025 pm 05:46 PM

How do I use Maven or Gradle for advanced Java project management, build automation, and dependency resolution?

How can I implement functional programming techniques in Java? How can I implement functional programming techniques in Java? Mar 11, 2025 pm 05:51 PM

How can I implement functional programming techniques in Java?

Node.js 20: Key Performance Boosts and New Features Node.js 20: Key Performance Boosts and New Features Mar 07, 2025 pm 06:12 PM

Node.js 20: Key Performance Boosts and New Features

Iceberg: The Future of Data Lake Tables Iceberg: The Future of Data Lake Tables Mar 07, 2025 pm 06:31 PM

Iceberg: The Future of Data Lake Tables

How can I use JPA (Java Persistence API) for object-relational mapping with advanced features like caching and lazy loading? How can I use JPA (Java Persistence API) for object-relational mapping with advanced features like caching and lazy loading? Mar 17, 2025 pm 05:43 PM

How can I use JPA (Java Persistence API) for object-relational mapping with advanced features like caching and lazy loading?

How do I implement multi-level caching in Java applications using libraries like Caffeine or Guava Cache? How do I implement multi-level caching in Java applications using libraries like Caffeine or Guava Cache? Mar 17, 2025 pm 05:44 PM

How do I implement multi-level caching in Java applications using libraries like Caffeine or Guava Cache?

See all articles