RFR: [6904367]: (coll) IdentityHashMap is resized before exceeding the expected maximum size

Jeff Hain jeffhain at rocketmail.com
Wed Jul 16 20:31:25 UTC 2014



Hi, took me some time to setup Maven/JMH and learn the basics.
(two tools in a day, phew, that's more than I usually do in a year! :)



>JIT can sometimes optimize the code so aggressively

I was trying to bench this aggressively optimized
version of the code, with the idea that:
- If the JVM thinks this code is not to be optimized,
  it should not slow down the program too much, and
  having clean code should suffice.
- If it decides to optimize it, then the optimized
  version must be the fastest possible, not to slow
  down the whole program.
  In particular, I've once "seen" some optimization actually
  slow things down (a cast from double to int, that was
  intentionally duplicated, got factored in common path,
  assuming that it was necessarily fast, but it wasn't...
  so I replaced one of the "(int)x" with "-(int)-x" and
  the awful perfs went away).

But I agree I have no clue whether the optimization would
be similar in another program.



>I suggest you try to express your benchmark in a tried framework like JMH:
>
>    http://openjdk.java.net/projects/code-tools/jmh/
>
>In particular I suggest studying included samples.
>
>Regards, Peter


Below the JMH version of my neanderthalian bench :)
followed by some results (with 1.7 bytecode, win7, core i7),

then a bench similar to the one you posted
(http://mail.openjdk.java.net/pipermail/core-libs-dev/2014-July/027681.html),
and results again.



@State(Scope.Thread)
public class JmhIHMBench {

    private static final int MAX_NBR_OF_MAPPINGS = 1*1000;
    
    final Map<Object, Object> map_original = new IdentityHashMap<Object, Object>();
    // etc.
    final Map<Object, Object> map_peter8noloop = new IdentityHashMapPeter8NoLoop<Object, Object>();

    Object[] keys;
    int i;
    private static Object[] newKeys(int size) {
        final Object[] keys = new Object[size];
        for (int i=0;i<keys.length;i++) {
            keys[i] = new Object();
        }
        return keys;
    }
    
    @Setup(Level.Iteration)
    public void prepare() {
        keys = newKeys(MAX_NBR_OF_MAPPINGS);
        i = 0;
    }

    @Benchmark
    public void bench_put_original(Blackhole bh) {
        bench_put(bh, this.map_original);
    }
    // etc.
    @Benchmark
    public void bench_put_peter8noloop(Blackhole bh) {
        bench_put(bh, this.map_peter8noloop);
    }

    private void bench_put(Blackhole bh, Map<Object,Object> map) {
        if (map.size() == MAX_NBR_OF_MAPPINGS) {
            map.clear();
            i = 0;
        }
        final Object kv = keys[i++];
        bh.consume(map.put(kv, kv));
    }
    
    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(".*" + JmhIHMBench.class.getSimpleName() + ".*")
                .warmupIterations(8)
                .measurementIterations(10)
                .threads(1)
                .forks(1)
                .shouldDoGC(false)
                .build();
        new Runner(opt).run();
    }
}
    /*
     * jdk7u51 (run 1):
Benchmark                                Mode   Samples        Score  Score error    Units
r.JmhIHMBench.bench_put_original        thrpt        10 84087111,944  6033159,942    ops/s
r.JmhIHMBench.bench_put_peter7          thrpt        10 68893501,546  1375694,507    ops/s
r.JmhIHMBench.bench_put_peter7noloop    thrpt        10 79900659,706  6637125,685    ops/s
r.JmhIHMBench.bench_put_peter8          thrpt        10 79062559,130  1392057,456    ops/s
r.JmhIHMBench.bench_put_peter8noloop    thrpt        10 89184331,506  2380981,771    ops/s
     */
    /*
     * jdk7u51 (run 2):
Benchmark                                Mode   Samples        Score  Score error    Units
r.JmhIHMBench.bench_put_original        thrpt        10 90430298,285  1749471,171    ops/s
r.JmhIHMBench.bench_put_peter7          thrpt        10 77895700,268  1118205,815    ops/s
r.JmhIHMBench.bench_put_peter7noloop    thrpt        10 87449460,422  2241899,330    ops/s
r.JmhIHMBench.bench_put_peter8          thrpt        10 79993955,944  1799749,550    ops/s
r.JmhIHMBench.bench_put_peter8noloop    thrpt        10 89818256,344   886977,083    ops/s
     */
    /*
     * jdk8u20 (run 1):
Benchmark                                Mode   Samples        Score  Score error    Units
r.JmhIHMBench.bench_put_original        thrpt        10 108675548,411  7130886,988    ops/s
r.JmhIHMBench.bench_put_peter7          thrpt        10 94452557,383  4030609,636    ops/s
r.JmhIHMBench.bench_put_peter7noloop    thrpt        10 99070373,936  2204912,685    ops/s
r.JmhIHMBench.bench_put_peter8          thrpt        10 106865766,992  6248051,431    ops/s
r.JmhIHMBench.bench_put_peter8noloop    thrpt        10 114880028,516  1176180,414    ops/s
     */
    /*
     * jdk8u20 (run 2):
Benchmark                                Mode   Samples        Score  Score error    Units
r.JmhIHMBench.bench_put_original        thrpt        10 117513077,228  2011080,121    ops/s
r.JmhIHMBench.bench_put_peter7          thrpt        10 108988770,194  1468043,321    ops/s
r.JmhIHMBench.bench_put_peter7noloop    thrpt        10 84796057,588  2641680,027    ops/s
r.JmhIHMBench.bench_put_peter8          thrpt        10 106910134,068  1880471,925    ops/s
r.JmhIHMBench.bench_put_peter8noloop    thrpt        10 116141855,333  3003362,217    ops/s
     */
    /* jdk9 (run 1):
Benchmark                                Mode   Samples        Score  Score error    Units
r.JmhIHMBench.bench_put_original        thrpt        10 99263492,210  2022006,733    ops/s
r.JmhIHMBench.bench_put_peter7          thrpt        10 92134658,090  1614673,726    ops/s
r.JmhIHMBench.bench_put_peter7noloop    thrpt        10 114824216,039 13609878,167    ops/s
r.JmhIHMBench.bench_put_peter8          thrpt        10 105875616,712  2756803,410    ops/s
r.JmhIHMBench.bench_put_peter8noloop    thrpt        10 115453779,958  2121710,424    ops/s
     */
    /* jdk9 (run 2):
Benchmark                                Mode   Samples        Score  Score error    Units
r.JmhIHMBench.bench_put_original        thrpt        10 124206227,820  5152351,422    ops/s
r.JmhIHMBench.bench_put_peter7          thrpt        10 106268224,078  2613094,225    ops/s
r.JmhIHMBench.bench_put_peter7noloop    thrpt        10 119525275,412 11532080,356    ops/s
r.JmhIHMBench.bench_put_peter8          thrpt        10 111851070,168  3486096,205    ops/s
r.JmhIHMBench.bench_put_peter8noloop    thrpt        10 112861864,414  1780180,439    ops/s
     */



@State(Scope.Thread)
public class PeterIHMBench {

    private static final int MAX_SIZE = 100*1000;
    
    Map<Object, Object> map_original = new IdentityHashMap<Object, Object>();
    // etc.
    Map<Object, Object> map_peter8noloop = new IdentityHashMapPeter8NoLoop<Object, Object>();

    @Benchmark
    public void putNewObject_original(Blackhole bh) {
        Object o = new Object();
        bh.consume(map_original.put(o, o));
        if (map_original.size() == MAX_SIZE) {
            map_original = new IdentityHashMap<Object, Object>();
        }
    }
    // etc.
    @Benchmark
    public void putNewObject_peter8noloop(Blackhole bh) {
        Object o = new Object();
        bh.consume(map_peter8noloop.put(o, o));
        if (map_peter8noloop.size() == MAX_SIZE) {
            map_peter8noloop = new IdentityHashMapPeter8NoLoop<Object, Object>();
        }
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(".*" + PeterIHMBench.class.getSimpleName() + ".*")
                .warmupIterations(8)
                .measurementIterations(10)
                .threads(1)
                .forks(1)
                .shouldDoGC(true)
                .build();
        new Runner(opt).run();
    }
}
    /*
     * jdk7u51 (run 1):
Benchmark                                     Mode   Samples        Score  Score error    Units
r.PeterIHMBench.putNewObject_original        thrpt        10 10004525,783   462787,537    ops/s
r.PeterIHMBench.putNewObject_peter7          thrpt        10  9892505,005   214656,134    ops/s
r.PeterIHMBench.putNewObject_peter7noloop    thrpt        10 11604018,473   254339,445    ops/s
r.PeterIHMBench.putNewObject_peter8          thrpt        10 11498803,030   294423,574    ops/s
r.PeterIHMBench.putNewObject_peter8noloop    thrpt        10 11507933,087   194513,444    ops/s
     */
    /*
     * jdk7u51 (run 2):
Benchmark                                     Mode   Samples        Score  Score error    Units
r.PeterIHMBench.putNewObject_original        thrpt        10 11697308,687   193861,487    ops/s
r.PeterIHMBench.putNewObject_peter7          thrpt        10 11560736,048   277497,212    ops/s
r.PeterIHMBench.putNewObject_peter7noloop    thrpt        10 11797755,781   271441,458    ops/s
r.PeterIHMBench.putNewObject_peter8          thrpt        10 11467002,211   152606,682    ops/s
r.PeterIHMBench.putNewObject_peter8noloop    thrpt        10 11359696,213   109906,982    ops/s
     */
    /*
     * jdk8u20 (run 1):
Benchmark                                     Mode   Samples        Score  Score error    Units
r.PeterIHMBench.putNewObject_original        thrpt        10 10556637,295   543838,781    ops/s
r.PeterIHMBench.putNewObject_peter7          thrpt        10 10442158,366   157466,040    ops/s
r.PeterIHMBench.putNewObject_peter7noloop    thrpt        10 11626264,545   196058,218    ops/s
r.PeterIHMBench.putNewObject_peter8          thrpt        10 11340692,293   147050,945    ops/s
r.PeterIHMBench.putNewObject_peter8noloop    thrpt        10 11227256,662   248432,999    ops/s
     */
    /*
     * jdk8u20 (run 2):
Benchmark                                     Mode   Samples        Score  Score error    Units
r.PeterIHMBench.putNewObject_original        thrpt        10 11685284,152   273100,180    ops/s
r.PeterIHMBench.putNewObject_peter7          thrpt        10 11816196,692   204855,265    ops/s
r.PeterIHMBench.putNewObject_peter7noloop    thrpt        10 11869428,586   245642,096    ops/s
r.PeterIHMBench.putNewObject_peter8          thrpt        10 11451236,836   167196,443    ops/s
r.PeterIHMBench.putNewObject_peter8noloop    thrpt        10 11220115,248   479475,990    ops/s
     */
    /*
     * jdk9 (run 1):
Benchmark                                     Mode   Samples        Score  Score error    Units
r.PeterIHMBench.putNewObject_original        thrpt        10 10225815,691   327563,053    ops/s
r.PeterIHMBench.putNewObject_peter7          thrpt        10 10419083,948   300111,842    ops/s
r.PeterIHMBench.putNewObject_peter7noloop    thrpt        10 11530842,399   195856,714    ops/s
r.PeterIHMBench.putNewObject_peter8          thrpt        10 11465396,343   181196,117    ops/s
r.PeterIHMBench.putNewObject_peter8noloop    thrpt        10 11808154,989   193408,009    ops/s
     */
    /*
     * jdk9 (run 2):
Benchmark                                     Mode   Samples        Score  Score error    Units
r.PeterIHMBench.putNewObject_original        thrpt        10 11215457,172   277124,889    ops/s
r.PeterIHMBench.putNewObject_peter7          thrpt        10 11288888,493   227178,822    ops/s
r.PeterIHMBench.putNewObject_peter7noloop    thrpt        10 11737293,594   193035,121    ops/s
r.PeterIHMBench.putNewObject_peter8          thrpt        10 11526357,378   141718,661    ops/s
r.PeterIHMBench.putNewObject_peter8noloop    thrpt        10 11756835,220   276815,538    ops/s
     */



-Jeff



More information about the core-libs-dev mailing list