EnumData space optimization in j.l.Class (JEP-146)

Peter Levart peter.levart at gmail.com
Mon Dec 17 15:36:42 UTC 2012


Hi David and others,

Here's a patch that eliminates one of two fields in java.lang.Class, 
related to caching enum constants:

http://dl.dropbox.com/u/101777488/jdk8-tl/JEP-149.enum/webrev.01/index.html

It does it by moving one field to a subclass of HashMap, which is 
referenced by a remaining field that serves two different 
purposes/stages of caching.

These are the results of a micro-benchmark that exercises public API 
that uses the internal j.l.Class API regarding enum constants:

enum MyEnum { ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN }
EnumSet.noneOf(MyEnum.class): 300_000_000 loops
MyEnum.valueOf(String): 30_000_000 loops * 10 calls for different names

** Original JDK8 code

Executing: /home/peter/Apps64/jdk1.8.0-jdk8-tl/bin/java -Xmx4G -cp 
../out/production/test test.EnumTest reference

       EnumSet.noneOf(Class): 351610312 340302968 339893333 339774384 
339750612 339558414 339547022 339621595
      MyEnum.valueOf(String): 935153830 897188742 887541353 960839820 
886119463 885818334 885827093 885752461
       EnumSet.noneOf(Class): 339552678 339469528 339513757 339451341 
339512154 339511634 339664326 339793144

** patched java.lang.Class

Executing: /home/peter/Apps64/jdk1.8.0-jdk8-tl/bin/java -Xmx4G -cp 
../out/production/test -Xbootclasspath/p:../out/production/jdk test.EnumTest

       EnumSet.noneOf(Class): 351724931 339286591 305082929 305042885 
305058303 305044144 305073463 305049604
      MyEnum.valueOf(String): 955032718 908534137 891406394 891506147 
891414312 893652469 891412757 891409294
       EnumSet.noneOf(Class): 414044087 406904161 406788898 406839824 
406765274 406815728 407002576 406779162

The slow-down of about 20% (last line) is presumably a consequence of 
another in-direction to obtain shared enum constants array when there is 
already a Map in place. It is still fast though (300M EnumSet instances 
/ 0.4 s).

Here's the source of the micro-benchmark:

https://raw.github.com/plevart/jdk8-tl/JEP-149.enum/test/src/test/EnumTest.java

I don't know what's more important in this occasion. A small space gain 
(8 or 4 bytes per j.l.Class instance) or a small performance gain (20%).

Regards, Peter




More information about the core-libs-dev mailing list