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

Tagir Valeev amaembo at gmail.com
Thu Jun 6 10:11:25 UTC 2019


Hello!


> The doc will change for HashSet and LinkedHashSet as currently it says
> that toArray methods are inherited from AbstractCollection which is not
> true anymore.
> For HashMap/LinkedHashMap doc should not change. I will post a specdiff to
> CSR [1] once I figure out how to generate it. I searched over OpenJDK wiki,
> but found no clue how to do it. Could anybody help me?
>

Seems I was wrong here: JavaDoc for JDK is generated with
--override-methods=summary option, so the resulting spec should not be
different.
I will try to generate it before and after applying the patch.


>
> With best regards,
> Tagir Valeev.
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8225393
>
>
>>
>> ToArray test:
>>
>> The other tests in that directory put the main() method first and work
>> down to the individual test methods.
>> Please re-order.
>>
>> Thanks, Roger
>>
>>
>>
>> On 06/05/2019 04:19 AM, Tagir Valeev wrote:
>> > 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