Hi Peter,

Opportunistically if your LinearProbeHashtable works out then i am wondering if 
we could replace the use of CHM within MethodType.ConcurrentWeakInternSet, 
which only uses get/putIfAbsent/remove.

Thereby CHM can use VarHandles without inducing a circular dependency.

Paul.

> On 26 May 2016, at 10:59, Peter Levart <peter.lev...@gmail.com> wrote:
> 
> Hi Michael,
> 
> On 05/23/2016 03:56 PM, Michael Haupt wrote:
>> I've ran the unpatched version and Peter's two patches once more. The 
>> results are attached (results.txt). They confirm Aleksey's observation.
>> 
>> Regarding the 03 patch (plevart3 column in the results), perfasm output (see 
>> http://cr.openjdk.java.net/~mhaupt/8031043/perfasm.zip) suggests the cost is 
>> mainly accrued in ConcurrentHashMap. The same is the case for the 02 patch 
>> (plevart2 column).
>> 
>> As things stand, I think we can even focus on Peter's 02 patch, as this is 
>> the faster of his two proposals (plevart2 column in the results), reduces 
>> the footprint, and reduces the implementation complexity. Can anything be 
>> done to improve on its performance? (It has slight performance slowdowns for 
>> the single-value case as well.)
> 
> I can't think of anything else short of improving performance of CHM itself.
> 
> Or replacing CHM with a "better" implementation:
> 
>     
> http://cr.openjdk.java.net/~plevart/misc/ClassValue.Alternative2/webrev.04/
> 
> This webrev is similar to webrev.02. It's only difference is in ClassValueMap 
> which extends LinearProbeHashtable instead of ConcurrentHashMap. 
> LinearProbeHashtable is a simple implementation of a linear-probe hash table. 
> It's not a full Map implementation. It only implements methods needed in 
> ClassValue. With this implementation I get a slight boost compared to JDK 9 
> ClassValue implementation for all sizes and counts:
> 
> Benchmark                         (classCount)  (classValueCount)  (impl)  
> Mode  Cnt   Score   Error  Units
> ClassValueBench.randomAccess               128                  1    jdk9  
> avgt   10   9.079 ± 0.092  ns/op
> ClassValueBench.randomAccess               128                  4    jdk9  
> avgt   10  10.615 ± 0.102  ns/op
> ClassValueBench.randomAccess               128                 16    jdk9  
> avgt   10  11.665 ± 0.012  ns/op
> ClassValueBench.randomAccess               128                256    jdk9  
> avgt   10  19.151 ± 0.219  ns/op
> ClassValueBench.randomAccess              1024                  1    jdk9  
> avgt   10  14.642 ± 0.425  ns/op
> ClassValueBench.randomAccess              1024                  4    jdk9  
> avgt   10  22.577 ± 0.093  ns/op
> ClassValueBench.randomAccess              1024                 16    jdk9  
> avgt   10  19.864 ± 0.736  ns/op
> ClassValueBench.randomAccess              1024                256    jdk9  
> avgt   10  60.470 ± 0.285  ns/op
> ClassValueBench.sequentialAccess           128                  1    jdk9  
> avgt   10   9.741 ± 0.033  ns/op
> ClassValueBench.sequentialAccess           128                  4    jdk9  
> avgt   10   8.252 ± 0.029  ns/op
> ClassValueBench.sequentialAccess           128                 16    jdk9  
> avgt   10   7.888 ± 1.249  ns/op
> ClassValueBench.sequentialAccess           128                256    jdk9  
> avgt   10  16.493 ± 0.415  ns/op
> ClassValueBench.sequentialAccess          1024                  1    jdk9  
> avgt   10  13.376 ± 0.452  ns/op
> ClassValueBench.sequentialAccess          1024                  4    jdk9  
> avgt   10  10.023 ± 0.020  ns/op
> ClassValueBench.sequentialAccess          1024                 16    jdk9  
> avgt   10   8.029 ± 0.178  ns/op
> ClassValueBench.sequentialAccess          1024                256    jdk9  
> avgt   10  33.472 ± 0.058  ns/op
> 
> Benchmark                         (classCount)  (classValueCount)  (impl)  
> Mode  Cnt   Score   Error  Units
> ClassValueBench.randomAccess               128                  1    pl04  
> avgt   10   8.955 ± 0.055  ns/op
> ClassValueBench.randomAccess               128                  4    pl04  
> avgt   10   9.999 ± 0.017  ns/op
> ClassValueBench.randomAccess               128                 16    pl04  
> avgt   10  11.615 ± 1.928  ns/op
> ClassValueBench.randomAccess               128                256    pl04  
> avgt   10  17.063 ± 0.460  ns/op
> ClassValueBench.randomAccess              1024                  1    pl04  
> avgt   10  12.553 ± 0.086  ns/op
> ClassValueBench.randomAccess              1024                  4    pl04  
> avgt   10  16.766 ± 0.221  ns/op
> ClassValueBench.randomAccess              1024                 16    pl04  
> avgt   10  18.496 ± 0.051  ns/op
> ClassValueBench.randomAccess              1024                256    pl04  
> avgt   10  41.390 ± 0.321  ns/op
> ClassValueBench.sequentialAccess           128                  1    pl04  
> avgt   10   7.854 ± 0.381  ns/op
> ClassValueBench.sequentialAccess           128                  4    pl04  
> avgt   10   7.498 ± 0.055  ns/op
> ClassValueBench.sequentialAccess           128                 16    pl04  
> avgt   10   9.218 ± 1.000  ns/op
> ClassValueBench.sequentialAccess           128                256    pl04  
> avgt   10  13.593 ± 0.275  ns/op
> ClassValueBench.sequentialAccess          1024                  1    pl04  
> avgt   10   8.774 ± 0.037  ns/op
> ClassValueBench.sequentialAccess          1024                  4    pl04  
> avgt   10   8.562 ± 0.014  ns/op
> ClassValueBench.sequentialAccess          1024                 16    pl04  
> avgt   10   7.596 ± 0.027  ns/op
> ClassValueBench.sequentialAccess          1024                256    pl04  
> avgt   10  24.605 ± 0.143  ns/op
> 
> 
> The footprint is even better than with CHM as LPHT does not maintain internal 
> Map.Entry(s).
> 
> How does this implementation compare on your hardware, Michael?
> 
> Regards, Peter
> 
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev@openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
mlvm-dev mailing list
mlvm-dev@openjdk.java.net
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev

Reply via email to