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