Classfile API performance and caching in Constant API

- liangchenblue at gmail.com
Fri Apr 21 16:23:34 UTC 2023


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 of https://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


More information about the classfile-api-dev mailing list