Caching symbolic descriptors for the constant pool
Brian Goetz
brian.goetz at oracle.com
Wed Apr 26 15:47:28 UTC 2023
Right, that was mostly aimed at other folks who are contributing --
"this is the most useful general-purpose bench IMO".
On 4/26/2023 11:45 AM, Adam Sotona wrote:
>
> Unfortunately AdaptNull/SHARED_3does not include symbols conversions
> and building performance (the use case of ProxyGenerator).
>
> I’ll try to add a benchmark focused on building from symbols.
>
> *From: *Brian Goetz <brian.goetz at oracle.com>
> *Date: *Wednesday, 26 April 2023 17:19
> *To: *Adam Sotona <adam.sotona at oracle.com>, liangchenblue at gmail.com
> <liangchenblue at gmail.com>, classfile-api-dev
> <classfile-api-dev at openjdk.org>
> *Subject: *Re: Caching symbolic descriptors for the constant pool
>
> BTW, I have found the AdaptNull/SHARED_3 benchmark to extremely useful
> for detecting *overall* regressions/improvements. (Obviously targeted
> benchmarks are more useful for targeted problems like this one, but if
> people are going to run one bench before and after a change, it should
> be this one.)
>
> On 4/26/2023 11:12 AM, Adam Sotona wrote:
>
> FYI: Here is draft of pull request with initial batch of
> performance improvements (no API change):
>
> https://github.com/openjdk/jdk/pull/13671
>
> It is branched from PR13478 due to its significant changes in
> StackMapGenerator.
>
> Here are some first measurable improvements:
>
> Benchmark Mode Cnt Score Error Units
>
> GenerateStackMaps.benchmark thrpt 10 407931.202 ± 13101.023 ops/s
>
> improved by approx 15% to:
>
> GenerateStackMaps.benchmark thrpt 10 470826.720 ± 3569.194 ops/s
>
> Adam
>
> *From: *classfile-api-dev <classfile-api-dev-retn at openjdk.org>
> <mailto:classfile-api-dev-retn at openjdk.org> on behalf of Adam
> Sotona <adam.sotona at oracle.com> <mailto:adam.sotona at oracle.com>
> *Date: *Tuesday, 25 April 2023 16:25
> *To: *Brian Goetz <brian.goetz at oracle.com>
> <mailto:brian.goetz at oracle.com>, liangchenblue at gmail.com
> <liangchenblue at gmail.com> <mailto:liangchenblue at gmail.com>,
> classfile-api-dev <classfile-api-dev at openjdk.org>
> <mailto:classfile-api-dev at openjdk.org>
> *Subject: *Re: Caching symbolic descriptors for the constant pool
>
> I think it perfectly fits to the performance improvements I’m
> working on.
>
> The “caching” here means to 1:1 store symbol with PoolEntry after
> the first request or when the entry has been created from the symbol.
>
> There is no risk of any growing global caches.
>
> If the Constants API will also “cache” internal class name in
> ClassDesc and ClassDescs of the MethodTypeDesc parameters and
> return type.
>
> Then we can achieve paths with minimal or no conversions, for example:
>
> ClassDesc -> MethodTypeDesc -> CodeBuilder -> PoolEntry ->
> InvokeInstruction -> StackMapGenerator -> ClassHierarchyResolver
> -> ClassDesc -> internal class name -> StackMapGenerator.Type ->
> PoolEntry -> BufWriterImpl -> internal class name
>
> *From: *classfile-api-dev <classfile-api-dev-retn at openjdk.org>
> <mailto:classfile-api-dev-retn at openjdk.org> on behalf of Brian
> Goetz <brian.goetz at oracle.com> <mailto:brian.goetz at oracle.com>
> *Date: *Tuesday, 25 April 2023 16:12
> *To: *liangchenblue at gmail.com <liangchenblue at gmail.com>
> <mailto:liangchenblue at gmail.com>, classfile-api-dev
> <classfile-api-dev at openjdk.org> <mailto:classfile-api-dev at openjdk.org>
> *Subject: *Re: Caching symbolic descriptors for the constant pool
>
> For caching symbols in the Class API, this is fine but we should
> wait a
> bit. Doing caching raises the question of where the cache lives
> and how
> long it lives; we had some discussions recently about caching for
> class
> hierarchy info, and concluded that we had reached the limits of
> what we
> can do with static entry points. By refactoring the main entry
> points
> (build/parse) to instance methods on a user-controlled "classfile
> context" object, we create a logical place and lifetime for
> caches, of
> which we now have two examples.
>
> Adam currently has a queue of patches he is trying to shepherd in,
> after
> which we will look at refactoring the CHA functionality, after
> which we
> will look at refactoring the "front door", and then that should
> leave a
> natural place to slot in caching of symbolic constants.
>
> On 4/24/2023 7:18 PM, - wrote:
> > First, thanks for the feedback on my cache proposal a few days ago!
> > I've prepared two patches under 8306697
> > https://github.com/openjdk/jdk/pull/13598and 8306698
> > https://github.com/openjdk/jdk/pull/13599, which will hopefully make
> > the Constant API more useful with classfiles.
> >
> > I wish to cache symbolic descriptors in classfile API itself. One of
> > the prime candidates identified by Adam in his migration of
> > java.lang.invoke to classfile API is ClassEntry.asSymbol, which from
> > my search, appears to be frequently used in stack map generation. In
> > addition, a MethodTypeDesc is passed to stack map generator
> > constructor via ofDescriptor (which has slow parsing even after
> Adam's
> > optimization), but the parsing can totally be averted if we can
> reuse
> > the MethodTypeDesc passed in withMethod(). Thus, I wish to add
> > accessors like typeSymbol() and cachedTypeSymbol() for MethodInfo to
> > speed up StackMapGenerator initialization.
> >
> > In addition, the stack map generator has a custom bitset-based
> tool to
> > split a descriptor on the fly (See
> > StackMapGenerator.processInvokeInstructions). I believe they can
> > benefit from reusing a parsed MethodTypeDesc as well, especially if
> > the invoke instructions were originally built with MethodTypeDesc.
> >
> > Chen Liang
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/classfile-api-dev/attachments/20230426/77036c7a/attachment-0001.htm>
More information about the classfile-api-dev
mailing list