RFR: 8295302: Do not use ArrayList when LambdaForm has a single ClassData
Vladimir Ivanov
vlivanov at openjdk.org
Thu Oct 13 22:34:44 UTC 2022
On Thu, 13 Oct 2022 21:53:47 GMT, Ioi Lam <iklam at openjdk.org> wrote:
> Please review this small optimization. As shown in the JBS issue, most of the generated LambdaForm classes have a single ClassData, so we can get a small footprint/speed improvement.
src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java line 321:
> 319: private MemberName loadMethod(byte[] classFile) {
> 320: Class<?> invokerClass = LOOKUP.makeHiddenClassDefiner(className, classFile, Set.of())
> 321: .defineClass(true, classDataValues());
Why not just put it in `classDataValues()` instead?
Object classDataValues() {
final List<ClassData> cd = classData;
return switch(cd.size()) {
case 0 -> null; // flatten for zero case
case 1 -> cd.get(0).value; // flatten for single value case
case 2 -> List.of(cd.get(0).value, cd.get(1).value);
...
And it also covers zero case for free.
src/java.base/share/classes/java/lang/invoke/InvokerBytecodeGenerator.java line 389:
> 387: mv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/invoke/MethodHandles",
> 388: "classData", "(Ljava/lang/Class;)Ljava/lang/Object;", false);
> 389: if (classData.size() == 1) {
if (classData.size() < 2) {
It works for zero case, because `checkcast` always succeeds on nulls.
-------------
PR: https://git.openjdk.org/jdk/pull/10706
More information about the core-libs-dev
mailing list