1 # Prototype implementations of HashMaps using inline classes for the table entries.
 2 
 3    **NOTE: The implementations have NOT been optimized or tuned.**
 4 
 5 ## YHashMap uses Open Addressing to store all entries in a table of inline classes
 6 The hash of the key is used as the first index into the table. 
 7 If there is a collision, double hashing (with a static offset) is used to probe subsequent locations for available storage.
 8 The Robin Hood hashing variation on insertion is used to reduce worst case lookup times.
 9 On key removal, the subsequent double-hashed entries are compressed into the entry being removed.
10 
11 ### YHashMap Storage requirements
12 Typical storage usage for a table near its load factor is 22 bytes per entry.
13 
14 Inserting entries into the YHashMap may resize the table but otherwise does
15 not use any additional memory on each get or put.
16 
17 ## XHashMap stores the initial entry in a table of inline classes
18 The hash of the key is used as the first index into the table. 
19 If there is a collision, subsequent entries add the familiar link list of Nodes.
20 On key removal, direct entries in the table are replaced by the first linked node;
21 for Nodes in the link list, the Node is unlinked.
22 
23 ### XHashMap Storage requirements:
24 Typical storage usage for a table near its load factor is 32 bytes per entry.
25 
26 ## java.util.HashMap (the original)
27 HashMap uses a table of references to the initial Node entries, collisions are handled by 
28 linked Nodes.
29 
30 ### HashMap Storage requirements:
31 Typical storage usage for a table near its load factor is 37 bytes per entry.
32 
33 
34 ## Sample JHM test results for Get, Put, Iteration, and Replacement
35 
36     Benchmark                                                   (mapType)  (seed)   (size)  Mode  Cnt    Score     Error  Units
37     GetX.getHit              org.openjdk.bench.valhalla.corelibs.YHashMap      42      500  avgt    5    0.007 ±   0.001  ms/op
38     GetX.getHit              org.openjdk.bench.valhalla.corelibs.XHashMap      42      500  avgt    5    0.006 ±   0.001  ms/op
39     GetX.getHit                                         java.util.HashMap      42      500  avgt    5    0.004 ±   0.001  ms/op
40     GetX.getHit              org.openjdk.bench.valhalla.corelibs.YHashMap      42  1000000  avgt    5   91.906 ±   3.417  ms/op
41     GetX.getHit              org.openjdk.bench.valhalla.corelibs.XHashMap      42  1000000  avgt    5   77.905 ±   8.267  ms/op
42     GetX.getHit                                         java.util.HashMap      42  1000000  avgt    5   79.900 ±   7.679  ms/op
43 
44     GetX.getMix              org.openjdk.bench.valhalla.corelibs.YHashMap      42      500  avgt    5    0.006 ±   0.001  ms/op
45     GetX.getMix              org.openjdk.bench.valhalla.corelibs.XHashMap      42      500  avgt    5    0.004 ±   0.001  ms/op
46     GetX.getMix                                         java.util.HashMap      42      500  avgt    5    0.004 ±   0.001  ms/op
47     GetX.getMix              org.openjdk.bench.valhalla.corelibs.YHashMap      42  1000000  avgt    5  174.739 ±  25.464  ms/op
48     GetX.getMix              org.openjdk.bench.valhalla.corelibs.XHashMap      42  1000000  avgt    5   77.241 ±   4.472  ms/op
49     GetX.getMix                                         java.util.HashMap      42  1000000  avgt    5  122.827 ±   8.779  ms/op
50 
51     PutX.put                 org.openjdk.bench.valhalla.corelibs.YHashMap      42      500  avgt    5    0.034 ±   0.005  ms/op
52     PutX.put                 org.openjdk.bench.valhalla.corelibs.XHashMap      42      500  avgt    5    0.025 ±   0.003  ms/op
53     PutX.put                                            java.util.HashMap      42      500  avgt    5    0.013 ±   0.001  ms/op
54     PutX.put                 org.openjdk.bench.valhalla.corelibs.YHashMap      42  1000000  avgt    5  459.951 ± 345.698  ms/op
55     PutX.put                 org.openjdk.bench.valhalla.corelibs.XHashMap      42  1000000  avgt    5  409.430 ± 146.610  ms/op
56     PutX.put                                            java.util.HashMap      42  1000000  avgt    5  336.873 ± 122.706  ms/op
57 
58     PutX.putSized            org.openjdk.bench.valhalla.corelibs.YHashMap      42      500  avgt    5    0.014 ±   0.002  ms/op
59     PutX.putSized            org.openjdk.bench.valhalla.corelibs.XHashMap      42      500  avgt    5    0.012 ±   0.002  ms/op
60     PutX.putSized                                       java.util.HashMap      42      500  avgt    5    0.010 ±   0.002  ms/op
61     PutX.putSized            org.openjdk.bench.valhalla.corelibs.YHashMap      42  1000000  avgt    5  263.196 ±  68.516  ms/op
62     PutX.putSized            org.openjdk.bench.valhalla.corelibs.XHashMap      42  1000000  avgt    5  292.726 ± 165.881  ms/op
63     PutX.putSized                                       java.util.HashMap      42  1000000  avgt    5  310.345 ± 176.412  ms/op
64 
65     ReplX.replace            org.openjdk.bench.valhalla.corelibs.YHashMap      42      500  avgt    5    0.023 ±   0.001  ms/op
66     ReplX.replace            org.openjdk.bench.valhalla.corelibs.XHashMap      42      500  avgt    5    0.011 ±   0.001  ms/op
67     ReplX.replace                                       java.util.HashMap      42      500  avgt    5    0.012 ±   0.001  ms/op
68     ReplX.replace            org.openjdk.bench.valhalla.corelibs.YHashMap      42  1000000  avgt    5  302.525 ±  13.322  ms/op
69     ReplX.replace            org.openjdk.bench.valhalla.corelibs.XHashMap      42  1000000  avgt    5  206.582 ±  33.568  ms/op
70     ReplX.replace                                       java.util.HashMap      42  1000000  avgt    5  231.924 ±  40.715  ms/op
71 
72     WalkX.sumIterator        org.openjdk.bench.valhalla.corelibs.YHashMap      42      500  avgt    5    0.003 ±   0.001  ms/op
73     WalkX.sumIterator        org.openjdk.bench.valhalla.corelibs.XHashMap      42      500  avgt    5    0.010 ±   0.001  ms/op
74     WalkX.sumIterator                                   java.util.HashMap      42      500  avgt    5    0.002 ±   0.001  ms/op
75     WalkX.sumIterator        org.openjdk.bench.valhalla.corelibs.YHashMap      42  1000000  avgt    5   43.471 ±   3.634  ms/op
76     WalkX.sumIterator        org.openjdk.bench.valhalla.corelibs.XHashMap      42  1000000  avgt    5   35.960 ±   2.046  ms/op
77     WalkX.sumIterator                                   java.util.HashMap      42  1000000  avgt    5   58.106 ±   3.852  ms/op
78 
79     WalkX.sumIteratorHidden  org.openjdk.bench.valhalla.corelibs.YHashMap      42      500  avgt    5    0.002 ±   0.001  ms/op
80     WalkX.sumIteratorHidden  org.openjdk.bench.valhalla.corelibs.XHashMap      42      500  avgt    5    0.007 ±   0.001  ms/op
81     WalkX.sumIteratorHidden                             java.util.HashMap      42      500  avgt    5    0.005 ±   0.001  ms/op
82     WalkX.sumIteratorHidden  org.openjdk.bench.valhalla.corelibs.YHashMap      42  1000000  avgt    5   33.189 ±   2.212  ms/op
83     WalkX.sumIteratorHidden  org.openjdk.bench.valhalla.corelibs.XHashMap      42  1000000  avgt    5   43.003 ±   1.183  ms/op
84     WalkX.sumIteratorHidden                             java.util.HashMap      42  1000000  avgt    5  102.566 ±   5.276  ms/op