ClassValue perf?
Peter Levart
peter.levart at gmail.com
Wed May 4 15:50:11 UTC 2016
Hi,
On 04/29/2016 10:28 AM, Michael Haupt wrote:
> All,
>
> see http://cr.openjdk.java.net/~mhaupt/8031043/
> <http://cr.openjdk.java.net/%7Emhaupt/8031043/> for a snapshot of what
> is currently available.
>
> We have three patches:
> * Christian's, which simply reduces the HashMap size,
> * Peter's, which refactors ClassValueMap into a WeakHashMap,
> * mine, which attempts to introduce the single-value storage
> optimisation John had suggested (I worked on performance with Aleksey
> - thanks!).
>
> All of these are collected in the patches subdirectory for
> convenience. (Peter, I adapted your patch to the new Unsafe location.)
>
> I extended Peter's benchmark (thanks!) to cover single-value storage;
> the source code is in the benchmark subdirectory, together with raw
> results from running the benchmark with each of the three patches
> applied. A results-only overview is in benchmark-results.txt.
>
> The three are roughly on par. I'm not sure the single-value storage
> optimisation improves much on footprint given the additional data that
> must be kept around to make transition to map storage safe.
>
> Opinions?
I must admit that my old patch is very complex, so I doubt anyone will
take time to review it. It is almost a clean-room re-implementation of
ClassValue API. My main motivation was footprint optimization for all
sizes - not just one value per class as I doubt this will be very common
situation anyway. Current ClassValue maintains 2 parallel hash-tables
per class. A WeakHashMap which is accessed with proper synchronization
and an optimized "cache" of entries for quick access. This makes it
consume almost 100 bytes per (Class, ClassValue) pair. I managed to
almost half the overhead for typical situation (1024 classes x 16
ClassValue(s)), but for the price of complexity.
Reviving this thread made me think about ClassValue again and I got
another idea. This is an experiment to see if ConcurrentHashMap could be
leveraged to implement ClassValue API with little added complexity:
http://cr.openjdk.java.net/~plevart/misc/ClassValue.Alternative2/webrev.01/
And here are the results of a benchmark comparing JDK 9 original with
this alternative:
http://cr.openjdk.java.net/~plevart/misc/ClassValue.Alternative2/ClassValueBench.java
It is a little slower for random access of bigger sizes and #s of
classes. Most probably a consequence of reduced cache hit ratio as CHM
is a classical hash table with buckets implemented as linked list of
entries whereas jdk 9 ClassValue cache is a linear-scan hash table which
has better cache locality. This is particularly obvious in sequential
access where CHM behaves on-par. It's a pity that CHM has a
non-changeable load factor of 0.75 as changing this to 0.5 would most
certainly improve benchmark results for a little more memory.
Where this version excels is in footprint. I managed to more than half
the overhead. There's only a single ReferenceQueue needed and
consequently expunging of stale data is more prompt and thorough. The
code of ClassValue has been more than halved too.
What do you think?
Regards, Peter
>
> Best,
>
> Michael
>
> --
>
> Oracle <http://www.oracle.com/>
> Dr. Michael Haupt | Principal Member of Technical Staff
> Phone: +49 331 200 7277 | Fax: +49 331 200 7561
> OracleJava Platform Group | LangTools Team | Nashorn
> Oracle Deutschland B.V. & Co. KG | Schiffbauergasse 14 | 14467
> Potsdam, Germany
>
> ORACLE Deutschland B.V. & Co. KG | Hauptverwaltung: Riesstraße 25,
> D-80992 München
> Registergericht: Amtsgericht München, HRA 95603
>
> Komplementärin: ORACLE Deutschland Verwaltung B.V. | Hertogswetering
> 163/167, 3543 AS Utrecht, Niederlande
> Handelsregister der Handelskammer Midden-Nederland, Nr. 30143697
> Geschäftsführer: Alexander van der Ven, Jan Schultheiss, Val Maher
> Green Oracle <http://www.oracle.com/commitment> Oracle is committed
> to developing practices and products that help protect the environment
>
>
>
>
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/mlvm-dev/attachments/20160504/458e63cc/attachment.html>
More information about the mlvm-dev
mailing list