RFR: 8170595: Optimize Class.isAnonymousClass
Claes Redestad
claes.redestad at oracle.com
Fri Dec 2 14:29:04 UTC 2016
Hi,
On 2016-12-01 22:25, Claes Redestad wrote:
> On 12/01/2016 10:21 AM, Mandy Chung wrote:
>>> On Dec 1, 2016, at 9:52 AM, Claes Redestad
>>> <claes.redestad at oracle.com> wrote:
>>>
>>> Hi,
>>>
>>> good suggestion, this tidies up a bit while not affecting score:
>>>
>>> http://cr.openjdk.java.net/~redestad/8170595/webrev.02
>> I like this better. It may be useful to add a private isTopLevel
>> Class() for getSimpleBinaryName to call that will benefit
>> getSimpleName and isMemberClass?
>
> Good idea, but this seems like an independent optimization we should
> do as a separate follow-up, no?
Found that both isMemberClass and isLocalClass can be optimized in a
vein very similar to isAnonymousClass. isTopLevelClass helps
getSimpleBinaryName a bit, and makes sense to implement for
completeness. After deeper testing it's clear that one of the
costlier operations in this code is getDeclaringClass0, which may spend
plenty of time (~30ns/op for String.class) in the VM walking the
list of inner classes to find the enclosing class - if any.
A very small improvement can also be attained by restructuring code so
that we don't instantiate the EnclosingMethodInfo
unless it's needed, but keep the checking to keep semantically identical
behavior:
http://cr.openjdk.java.net/~redestad/8170595/webrev.03/
This brings significant improvements to some variants:
Baseline:
Benchmark Mode Cnt Score Error Units
Clazz.isAnonymousClass_Anon avgt 25 211.010 ± 22.974 ns/op
Clazz.isAnonymousClass_Regular avgt 25 132.198 ± 23.817 ns/op
Clazz.isMemberClass_Anon avgt 25 336.149 ± 43.215 ns/op
Clazz.isMemberClass_Regular avgt 25 92.502 ± 9.804 ns/op
Clazz.isLocalClass_Anon avgt 25 326.158 ± 34.051 ns/op
Clazz.isLocalClass_Regular avgt 25 32.086 ± 2.750 ns/op
Patch:
Benchmark Mode Cnt Score Error Units
Clazz.isAnonymousClass_Anon avgt 25 174.526 ± 16.292 ns/op
Clazz.isAnonymousClass_Regular avgt 25 33.136 ± 2.636 ns/op
Clazz.isMemberClass_Anon avgt 25 115.029 ± 9.464 ns/op
Clazz.isMemberClass_Regular avgt 25 85.706 ± 3.984 ns/op
Clazz.isLocalClass_Anon avgt 25 177.411 ± 22.927 ns/op
Clazz.isLocalClass_Regular avgt 25 31.940 ± 2.346 ns/op
Since the changes are all similar but still not too expansive, I'm
leaning towards just keeping this
change in one bug.
Thanks!
More information about the core-libs-dev
mailing list