RFR: 8266622: Optimize Class.descriptorString() and Class.getCanonicalName0() [v2]

Сергей Цыпанов github.com+10835776+stsypanov at openjdk.java.net
Thu May 13 12:56:24 UTC 2021


On Wed, 12 May 2021 10:20:46 GMT, Claes Redestad <redestad at openjdk.org> wrote:

>> Сергей Цыпанов has updated the pull request incrementally with one additional commit since the last revision:
>> 
>>   8266622: Remove pointless String.substring() call
>
> src/java.base/share/classes/java/lang/Class.java line 4377:
> 
>> 4375:                     .append(name.substring(0, index).replace('.', '/'))
>> 4376:                     .append('.')
>> 4377:                     .append(name.substring(index + 1))
> 
> `.append(name, index + 1, name.length())` might be a small win here, but it might be hard to benchmark this branch since it's only for hidden classes.

Indeed, I've measured the case for hidden classes with benchmark

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class HiddenClassBenchmark {
  private Class<?> hiddenClass;

  @Setup
  public void setUp() throws Exception {
    byte[] bytes = getClassWriter().toByteArray();

    hiddenClass = MethodHandles
            .lookup()
            .defineHiddenClass(bytes, true, NESTMATE)
            .lookupClass();

    if (hiddenClass.isHidden()) {
      return;
    }
    throw new RuntimeException();
  }

  @Benchmark
  public String descriptorString() {
    return hiddenClass.descriptorString();
  }

  private static ClassWriter getClassWriter() {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);

    var name = HiddenClassDemo.class.getName().replace('.', '/');
    cw.visit(V1_6, ACC_PUBLIC + ACC_SUPER, name, null, "java/lang/Object", null);
    cw.visitEnd();
    return cw;
  }

  private static class HiddenClassDemo {
  }
}

and got those results:

jdk 16
Benchmark                                                               Mode  Cnt     Score    Error   Units
HiddenClassBenchmark.descriptorString                                   avgt  100   112.591 ±  1.320   ns/op
HiddenClassBenchmark.descriptorString:·gc.alloc.rate.norm               avgt  100   600.045 ±  0.001    B/op

patched

Benchmark                                                               Mode  Cnt     Score    Error   Units
HiddenClassBenchmark.descriptorString                                   avgt  100    85.958 ±  0.561   ns/op
HiddenClassBenchmark.descriptorString:·gc.alloc.rate.norm               avgt  100   448.034 ±  0.001    B/op

patched without substring

Benchmark                                                               Mode  Cnt     Score    Error   Units
HiddenClassBenchmark.descriptorString                                   avgt  100    76.580 ±  0.587   ns/op
HiddenClassBenchmark.descriptorString:·gc.alloc.rate.norm               avgt  100   432.031 ±  0.001    B/op

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

PR: https://git.openjdk.java.net/jdk/pull/3903


More information about the core-libs-dev mailing list