RFR: 8322292: Rearrange comparison of fields in Record.equals()
Sergey Tsypanov
stsypanov at openjdk.org
Mon Dec 18 17:53:57 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.
-------------
Commit messages:
- 8322292: Update copyright
- 8322292: Shift arrays and Iterables down
- Improve Record.equals()
Changes: https://git.openjdk.org/jdk/pull/17143/files
Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=17143&range=00
Issue: https://bugs.openjdk.org/browse/JDK-8322292
Stats: 12 lines in 1 file changed: 9 ins; 0 del; 3 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