RFR: 8322292: Rearrange comparison of fields in Record.equals() [v6]

Sergey Tsypanov stsypanov at openjdk.org
Fri Dec 22 13:00:11 UTC 2023


> Currently if we create a record it's fields are compared in their declaration order. This might be ineffective in cases when two objects have "heavy" fields equals to each other, but different "lightweight" fields (heavy and lightweight in terms of comparison) e.g. primitives, enums, nullable/non-nulls etc.
> 
> If we have declared a record like
> 
> public record MyRecord(String field1, int field2) {}
> 
> It's equals() looks like:
> 
>   public final equals(Ljava/lang/Object;)Z
>    L0
>     LINENUMBER 3 L0
>     ALOAD 0
>     ALOAD 1
>     INVOKEDYNAMIC equals(Lcom/caspianone/openbanking/productservice/controller/MyRecord;Ljava/lang/Object;)Z [
>       // handle kind 0x6 : INVOKESTATIC
>       java/lang/runtime/ObjectMethods.bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;
>       // arguments:
>       com.caspianone.openbanking.productservice.controller.MyRecord.class,
>       "field1;field2",
>       // handle kind 0x1 : GETFIELD
>       com/caspianone/openbanking/productservice/controller/MyRecord.field1(Ljava/lang/String;),
>       // handle kind 0x1 : GETFIELD
>       com/caspianone/openbanking/productservice/controller/MyRecord.field2(I)
>     ]
>     IRETURN
>    L1
>     LOCALVARIABLE this Lcom/caspianone/openbanking/productservice/controller/MyRecord; L0 L1 0
>     LOCALVARIABLE o Ljava/lang/Object; L0 L1 1
>     MAXSTACK = 2
>     MAXLOCALS = 2
> 
> This can be improved by rearranging the comparison order of the fields moving enums and primitives upper, and collections/arrays lower.

Sergey Tsypanov has updated the pull request incrementally with two additional commits since the last revision:

 - Merge remote-tracking branch 'origin/record-equals' into record-equals
 - 8322292: Add test case

-------------

Changes:
  - all: https://git.openjdk.org/jdk/pull/17143/files
  - new: https://git.openjdk.org/jdk/pull/17143/files/158d9a83..037a3fd1

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=17143&range=05
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=17143&range=04-05

  Stats: 42 lines in 1 file changed: 41 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/17143.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/17143/head:pull/17143

PR: https://git.openjdk.org/jdk/pull/17143


More information about the core-libs-dev mailing list