RFR: [6904367]: (coll) IdentityHashMap is resized before exceeding the expected maximum size
Peter Levart
peter.levart at gmail.com
Mon Jul 14 13:14:46 UTC 2014
Hi Jeff,
Home grown loops are not the best way of micro-benchmarking (have done
it myself and learned it). JIT can sometimes optimize the code so
aggressively that performance differences you obtain from such
benchmarks just show that your concrete program can be optimized better
and not that an average program using some function you are trying to
measure can run faster too.
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
On 07/14/2014 02:24 AM, Jeff Hain wrote:
>
>> Can you post the benchmark source?
> Before the source, here are the time ranges runs were stabilizing in
> for lucky executions (using 1.7 for compiler compliance level, and
> win7 / core i7) :
>
> | original | peter7 | peter7 | peter8 | peter8 |
> | | | no loop | | no loop |
> ---------+----------+----------+----------+----------+----------+
> jdk7u51 | 0.56-59s | 0.66-68s | 0.62-64s | 0.60-63s | 0.70-74s |
> jdk8u20 | 0.54-58s | 0.64-66s | 0.58-60s | 0.58-61s | 0.73-76s |
> jdk9 | 0.59-61s | 0.65-67s | 0.73-75s | 0.60-63s | 0.76-78s |
>
> => The no-loop version seems only better for jdk <= 8 and your webrev 07,
> and for webrev 08, it seems actually (much) worse whatever the jdk.
> => jdk 8 looks faster than 7, but for some reason also faster than 9.
>
>
> public class IdentityHashMapPerf {
> private static final int MAX_NBR_OF_MAPPINGS = 1*1000;
> private static final int MAX_NBR_OF_CALLS = 100*1000*1000;
> private static final int NBR_OF_RUNS = 10;
>
> public static void main(String[] args) {
> System.out.println(IdentityHashMapPerf.class.getSimpleName()+"...");
> for (int k=0;k<NBR_OF_RUNS;k++) {
> // Quick run for code discovery for k = 0.
> final int maxNbrOfCalls = (k == 0) ? MAX_NBR_OF_MAPPINGS
> : MAX_NBR_OF_CALLS;
> bench_put(new IdentityHashMap<Integer, Integer>(), maxNbrOfCalls);
> //bench_put(new IdentityHashMapPeter7<Integer, Integer>(), maxNbrOfCalls);
> //bench_put(new IdentityHashMapPeter7NoLoop<Integer, Integer>(), maxNbrOfCalls);
> //bench_put(new IdentityHashMapPeter8<Integer, Integer>(), maxNbrOfCalls);
> //bench_put(new IdentityHashMapPeter8NoLoop<Integer, Integer>(), maxNbrOfCalls);
> }
> System.out.println("..."+IdentityHashMapPerf.class.getSimpleName());
> }
>
> private static void bench_put(Map<Integer, Integer> map, int maxNbrOfCalls) {
> for (int k=0;k<2;k++) {
> final Integer[] keys = newKeys(MAX_NBR_OF_MAPPINGS);
> final int nbrOfClearAndPuts = maxNbrOfCalls/MAX_NBR_OF_MAPPINGS;
> long a = System.nanoTime();
> {
> for (int cap=0;cap<nbrOfClearAndPuts;cap++) {
> map.clear();
> for (int i=0;i<MAX_NBR_OF_MAPPINGS;i++) {
> final Integer kv = keys[i];
> map.put(kv, kv);
> }
> if (map.size() != MAX_NBR_OF_MAPPINGS) {
> throw new AssertionError("anti optim");
> }
> }
> }
> long b = System.nanoTime();
> System.out.println(nbrOfClearAndPuts+" * "+MAX_NBR_OF_MAPPINGS
> +" "+map.getClass().getSimpleName()+".put(,) took "+((b-a)/1e9)+" s");
> }
> }
>
> private static Integer[] newKeys(int size) {
> final Integer[] keys = new Integer[size];
> for (int i=0;i<keys.length;i++) {
> keys[i] = i;
> }
> return keys;
>
> }
> }
>
>
> -Jeff
More information about the core-libs-dev
mailing list