Classfile API performance and caching in Constant API

Brian Goetz brian.goetz at oracle.com
Fri Apr 21 16:29:23 UTC 2023


Can you separate the pure JDK implementation improvements (e.g., making 
j.u.c more efficient) from the "switch to using classfile API in X" into 
separate patches?

On 4/21/2023 12:23 PM, - wrote:
> If there is no objection, I will submit a patch incorporating the
> caching and internalName method to the Constant API, to make the
> Classfile API more efficient.
>
> Chen
>
> On Wed, Apr 19, 2023 at 11:15 PM -<liangchenblue at gmail.com>  wrote:
>> Hello,
>> Since Adam has revealed that Classfile API is somewhat hampered by
>> performance issues and added a few patches in
>> https://github.com/openjdk/jdk/pull/12945/  that performs caching,
>>
>> His patch focuses on two optimizations:
>> 1. Speed up construction of descriptor string for MethodTypeDesc
>> 2. Caching of ClassDesc symbol in ClassEntry (representing CONSTANT_Class_info)
>>
>> Inspired by and in addition to his patches, I decided to try and see
>> the extent of performance impact of repeated string computation and
>> allocations from:
>> 1. Creation of internal names from ClassDesc
>>      I added a temporary API, String internalName(), to ClassDesc. This
>> API is forward-compatible with Valhalla, that it returns a String
>> suitable for a CONSTANT_Class_info.
>> 2. Repeated descriptorString calls on MethodTypeDesc
>>      I added a simple caching logic, much like the existing one in
>> java.lang.invoke.MethodType.
>> In addition, if the internal name and descriptor string are already
>> available via factory methods, the cache fields are immediately
>> assigned as well.
>>
>> The results are promising: In jdk.classfile.Write benchmark
>> https://github.com/openjdk/jdk/blob/master/test/micro/org/openjdk/bench/jdk/classfile/Write.java,
>> The throughput with Classfile API increased by 1/3.
>>
>> Master (Patch ofhttps://bugs.openjdk.org/browse/JDK-8305669, since
>> otherwise cannot run JMH with make on Windows):
>> Benchmark                Mode  Cnt      Score     Error  Units
>> Write.asmStream         thrpt    5  44866.172 ± 144.049  ops/s
>> Write.jdkTree           thrpt    5  16282.041 ±  95.782  ops/s
>> Write.jdkTreePrimitive  thrpt    5  16352.972 ± 280.751  ops/s
>>
>> New (https://github.com/liachmodded/jdk/commit/e33261ad197c33836d56b4b48acabc04880a780b)
>> Benchmark                Mode  Cnt      Score     Error  Units
>> Write.asmStream         thrpt    5  45695.225 ± 649.249  ops/s
>> Write.jdkTree           thrpt    5  22786.872 ± 256.329  ops/s
>> Write.jdkTreePrimitive  thrpt    5  22437.085 ± 397.090  ops/s
>>
>> As a result, I believe it may be worth to update the Constant API to
>> offer ClassDesc::internalName() and method type descriptor string
>> caching, to enable better performance in the Classfile API.
>>
>> Thanks for reading,
>> Chen Liang
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/classfile-api-dev/attachments/20230421/2c9a5cb3/attachment.htm>


More information about the classfile-api-dev mailing list