Hi Claes,

On 11/10/2014 1:10 AM, Claes Redestad wrote:
Hi all,

please review this patch which attempts to clean up synchronization and
improve scalability when defining and getting java.lang.Package objects.

Is this a real problem or a theoretical one? I've not previously heard of getting Package objects as being critical. ConcurrentHashMap improves the contended case but if we aren't normally contended then it will degrade performance. How does this perform on real code?

I'm also wondering how this impacts the initialization order of the VM as we need a lot more classes to be loaded and initialized when the first Package is created.

Thanks,
David

webrev: http://cr.openjdk.java.net/~redestad/8060130/webrev.02/
bug: https://bugs.openjdk.java.net/browse/JDK-8060130

Testing: jtreg, UTE vm.parallel_class_loading.testlist, various benchmarks

Torturing the retrieval code with a simple microbenchmark[1] shows that
the existing code
could cause bottlenecks, but also that the proposed patch works slightly
faster even in
uncontended cases:

Benchmark                           Mode  Samples   Score Score error Units
baseline, 1 thread:
o.s.SimpleBench.getClassPackage    thrpt       10 11.621        0.618
ops/us
o.s.SimpleBench.getPackage         thrpt       10 41.754        3.381
ops/us
o.s.SimpleBench.getPackages        thrpt       10 0.009        0.000
ops/us

baseline, 2 threads:
o.s.SimpleBench.getClassPackage    thrpt       10 7.884        1.977
ops/us
o.s.SimpleBench.getPackage         thrpt       10 17.013        8.079
ops/us
o.s.SimpleBench.getPackages        thrpt       10 0.004        0.001
ops/us

patch applied, 1 thread:
o.s.SimpleBench.getClassPackage    thrpt       10 13.519        0.170
ops/us
o.s.SimpleBench.getPackage         thrpt       10 59.999        0.988
ops/us
o.s.SimpleBench.getPackages        thrpt       10 0.019        0.001
ops/us

patch applied, 2 threads:
o.s.SimpleBench.getClassPackage    thrpt       10 19.181        3.688
ops/us
o.s.SimpleBench.getPackage         thrpt       10 79.708       31.220
ops/us
o.s.SimpleBench.getPackages        thrpt       10 0.025        0.006
ops/us

/Claes

[1]
package org.sample;

import org.openjdk.jmh.annotations.*;

@State(Scope.Thread)
public class SimpleBench {

     @Benchmark
     public Package[] getPackages() {
         return Package.getPackages();
     }

     @Benchmark
     public Package getClassPackage() {
         return this.getClass().getPackage();
     }

     @Benchmark
     public Package getPackage() {
         return Package.getPackage("java.util.zip");
     }
}

Reply via email to