RFR JDK-8225339 Optimize HashMap.keySet()/HashMap.values()/HashSet toArray() methods

Tagir Valeev amaembo at gmail.com
Wed Jun 5 08:19:21 UTC 2019


Hello!

Please review the specialized implementation of toArray method in
(Linked)HashMap/HashSet:
https://bugs.openjdk.java.net/browse/JDK-8225339
http://cr.openjdk.java.net/~tvaleev/webrev/8225339/r1/

Here's shortened benchmark output for keySet().toArray() ( KeySetToArray  )
and keySet().toArray(new String[0]) (KeySetToArrayTyped):
Benchmark               (mapType)  (size)      C2-orig  C2-patched
Graal-orig Graal-patched
KeySetToArray             HashMap       0        7.504       7.267
13.195         6.404
KeySetToArray             HashMap       1       43.222      27.720
50.093        26.623
KeySetToArray             HashMap      10      101.087      51.778
 116.605        59.520
KeySetToArray             HashMap    1000     8546.031    4008.694
 11216.667      5726.983
KeySetToArray             HashMap  100000  1619722.598  574863.302
 1467273.538    910837.681
KeySetToArray       LinkedHashMap       0        7.830       6.479
12.944         6.187
KeySetToArray       LinkedHashMap       1       18.644       9.369
18.499        10.375
KeySetToArray       LinkedHashMap      10       57.622      32.903
71.410        37.072
KeySetToArray       LinkedHashMap    1000     5041.059    4563.318
6020.531      4348.969
KeySetToArray       LinkedHashMap  100000   949706.126  737959.825
873106.291    839018.677
KeySetToArrayTyped        HashMap       0        5.578       5.112
16.265         4.860
KeySetToArrayTyped        HashMap       1       42.162      21.757
54.329        29.137
KeySetToArrayTyped        HashMap      10       99.719      47.455
 126.767        63.958
KeySetToArrayTyped        HashMap    1000    10961.851    4251.996
 11908.622      5760.225
KeySetToArrayTyped        HashMap  100000  1647795.795  759171.750
 1601851.965    915145.116
KeySetToArrayTyped  LinkedHashMap       0        5.531       4.928
12.524         5.090
KeySetToArrayTyped  LinkedHashMap       1       22.017      10.534
26.641        15.983
KeySetToArrayTyped  LinkedHashMap      10       64.832      36.017
88.757        41.172
KeySetToArrayTyped  LinkedHashMap    1000     5265.125    4492.492
6979.131      4394.444
KeySetToArrayTyped  LinkedHashMap  100000  1003702.468  818225.090
985088.932    809797.822

For values().toArray() the results are very similar. Complete JMH output is
here:
http://cr.openjdk.java.net/~tvaleev/jmh/JDK-8225339/
Benchmark source is included into the patch

As you can see, speedup is observed in every test. For HashMap it's about
2x, for LinkedHashMap it's usually smaller (presumably because the
LinkedHashIterator state is simpler than HashIterator).

I also added some unit-tests for toArray methods (HashMap/ToArray.java). I
put it inside HashMap folder as most of changes are in HashMap class. As
this patch should preserve the semantics, unit-tests pass on both
non-patched and patched version.

With best regards,
Tagir Valeev.


More information about the core-libs-dev mailing list