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