RFR (S) CR 8016236: Class.getGenericInterfaces performance improvement
Peter Levart
peter.levart at gmail.com
Mon Jun 10 20:57:49 UTC 2013
Hi Aleksey,
When 'sun.reflect.noCaches=true' system property is defined,
reflectionData() returns null. In that case, the code should cope
without using ReflectionData (no caching). See other uses of
reflectionData() (for example: in privateGetDeclaredFields())...
I should note that ReflectionData is invalidated when the class is
redefined. I don't know if generic signature is one of those things that
can change with class redefinition, but invalidation is just one purpose
of ReflectionData and the other is caching (via SoftReference), so
generic signature can be added to it for that purpose. If
'genericSignature' is cached on ReflectionData then it would be
consistent to also cache the derived 'genericInfo', what do you think?
I don't think 3 fields are needed (genericSignatureResolved,
genericSignature & genericInfo). I think one boolean flag (say :
genericInfoPresent) and genericInfo is all that is needed. If there was
a singleton ClassRepository NONE instance, then event the boolean flag
wouldn't be needed.
Regards, Peter
On 06/10/2013 05:53 PM, Aleksey Shipilev wrote:
> Hi,
>
> This is the follow-up on the issue Doug identified:
> http://mail.openjdk.java.net/pipermail/core-libs-dev/2013-June/017798.html
>
> I had reworked the patch, webrev is here:
> http://cr.openjdk.java.net/~shade/8016236/webrev.01/
>
> Notable differences from Doug's version are:
> - handle non-generic cases as well
> - reuse ReflectionData to cache the interfaces and generic signatures
> - code style (chained ternary operators blown up)
> - fixes the race along the way
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6398355
>
> Testing:
> - Linux x86_64/release: build OK
> - Linux x86_64/release: java/lang/reflect regression tests OK
> - Microbenchmarks show whooping increase in performance, see below
>
> (If there are no stylistic and other comments, I would like to do the
> JPRT submit and/or additional testing [which?]).
>
> The benchmark is here (you need JMH to build and run):
> http://cr.openjdk.java.net/~shade/8016236/classbench.zip
>
> Before:
>> Benchmark Mode Thr Cnt Sec Mean Mean error Units
>> o.b.ClassBench.generic_getGenericInterfaces avgt 1 5 1 326.835 1.220 nsec/op
>> o.b.ClassBench.generic_getGenericSuperclass avgt 1 5 1 308.793 2.828 nsec/op
>> o.b.ClassBench.generic_getTypeParameters avgt 1 5 1 312.627 1.637 nsec/op
>> o.b.ClassBench.raw_getGenericInterfaces avgt 1 5 1 216.983 8.902 nsec/op
>> o.b.ClassBench.raw_getGenericSuperclass avgt 1 5 1 59.933 0.183 nsec/op
>> o.b.ClassBench.raw_getTypeParameters avgt 1 5 1 65.469 0.284 nsec/op
> Doug's version:
>> Benchmark Mode Thr Cnt Sec Mean Mean error Units
>> o.b.ClassBench.generic_getGenericInterfaces avgt 1 5 1 15.106 0.271 nsec/op
>> o.b.ClassBench.generic_getGenericSuperclass avgt 1 5 1 5.304 0.024 nsec/op
>> o.b.ClassBench.generic_getTypeParameters avgt 1 5 1 16.739 0.045 nsec/op
>> o.b.ClassBench.raw_getGenericInterfaces avgt 1 5 1 213.825 1.346 nsec/op
>> o.b.ClassBench.raw_getGenericSuperclass avgt 1 5 1 61.651 0.394 nsec/op
>> o.b.ClassBench.raw_getTypeParameters avgt 1 5 1 64.340 0.522 nsec/op
> After:
>> Benchmark Mode Thr Cnt Sec Mean Mean error Units
>> o.b.ClassBench.generic_getGenericInterfaces avgt 1 5 1 14.985 0.104 nsec/op
>> o.b.ClassBench.generic_getGenericSuperclass avgt 1 5 1 5.300 0.008 nsec/op
>> o.b.ClassBench.generic_getTypeParameters avgt 1 5 1 16.874 0.175 nsec/op
>> o.b.ClassBench.raw_getGenericInterfaces avgt 1 5 1 23.941 0.177 nsec/op
>> o.b.ClassBench.raw_getGenericSuperclass avgt 1 5 1 8.583 0.044 nsec/op
>> o.b.ClassBench.raw_getTypeParameters avgt 1 5 1 12.400 0.045 nsec/op
> Thanks,
> Aleksey.
More information about the core-libs-dev
mailing list