RFR: 8196340: (coll) Examine overriding inherited methods in ArrayList and ArrayList.SubList

Ivan Gerasimov ivan.gerasimov at oracle.com
Sat May 12 01:38:55 UTC 2018


Hi Claes!

One thing I can't figure out is why both these two checks are necessary:

1303             checkForComodification();
1304             root.checkForComodification(expectedModCount);

The former compares the current root.modCount with the one at the time 
this subList was created.

The later one compares the current root.modCount with the one at the 
time the method was called.

If the later fails, wouldn't it imply the former should also have failed?


With kind regards,

Ivan



On 5/11/18 4:48 PM, Claes Redestad wrote:
> Anyhow, this is the current state of things:
>
> http://cr.openjdk.java.net/~redestad/8196340/open.01/
>
> I think the remaining difference between ArrayList$SubList and COWAL 
> is down to the comodification checks in the former eating up too much 
> inlining budget, but haven't had any luck yet.
>
> /Claes
>
> On 2018-05-12 01:29, Claes Redestad wrote:
>> Good, this demonstrates the gain from specializing o.getClass() == 
>> ArrayList.class, which is most of the speed-up here as well as in my 
>> own micro:
>>
>> Patched:
>> Method                      Millis Ratio
>> ArrayList equals                17 1.000
>> ArrayList$SubList equals       108 6.312
>> CopyOnWriteArrayList equals     67 3.942
>>
>> Baseline:
>> Method                      Millis Ratio
>> ArrayList equals               139 1.000
>> ArrayList$SubList equals       133 0.956
>> CopyOnWriteArrayList equals     59 0.429
>>
>> Even without peeling I think we should be able to make ArrayList and 
>> ArrayList$SubList equals as fast as COWAL, so I'll investigate why 
>> they still differ.
>>
>> /Claes
>>
>>
>> On 2018-05-12 00:49, Martin Buchholz wrote:
>>> Yet another microbenchmark coming your way.  Embarrassing to have 
>>> COWAL win all these so handily.
>>>
>>> --- IteratorMicroBenchmark.java11 May 2018 18:19:10 -00001.45
>>> +++ IteratorMicroBenchmark.java11 May 2018 22:35:32 -00001.46
>>> @@ -564,6 +564,12 @@
>>>  sum[0] = 0;
>>>  x.replaceAll(sneakyAdder);
>>>  check.sum(sum[0]);}}},
>>> +            new Job(klazz + " equals") {
>>> +                public void work() throws Throwable {
>>> + ArrayList<Integer> copy = new ArrayList<>(x);
>>> +                    for (int i = 0; i < iterations; i++) {
>>> + if (!x.equals(copy))
>>> +     throw new AssertionError();}}},
>>>              new Job(klazz + " hashCode") {
>>>                  public void work() throws Throwable {
>>>                      int hashCode = Arrays.hashCode(x.toArray());
>>>
>>>
>>> C2:
>>> Method             Millis Ratio
>>> ArrayList equals                 58 1.000
>>> ArrayList$SubList equals                72 1.240
>>> LinkedList equals                 101 1.739
>>> AbstractList$SubList equals            164 2.822
>>> Vector equals                 162 2.790
>>> SynchronizedRandomAccessList equals    182 3.129
>>> CopyOnWriteArrayList equals             22 0.394
>>> COWSubList equals                  19 0.336
>>>
>>> C1:
>>> Method             Millis Ratio
>>> ArrayList equals                300 1.000
>>> ArrayList$SubList equals               389 1.297
>>> LinkedList equals                 328 1.094
>>> AbstractList$SubList equals            349 1.162
>>> Vector equals                 263 0.876
>>> SynchronizedRandomAccessList equals    395 1.314
>>> CopyOnWriteArrayList equals             78 0.262
>>> COWSubList equals                  80 0.269
>>>
>>
>

-- 
With kind regards,
Ivan Gerasimov



More information about the core-libs-dev mailing list