[concurrency-interest] RFR [8011215] optimization of CopyOnWriteArrayList.addIfAbsent()

Louis Wasserman lowasser at google.com
Tue Apr 2 21:49:09 UTC 2013


Can we see the implementation of your benchmark?  Accurate benchmarking is
extremely nontrivial.


On Tue, Apr 2, 2013 at 2:34 PM, Ivan Gerasimov <ivan.gerasimov at oracle.com>wrote:

> Thank you Stanimir!
>
> My main goal was to get rid of early and possibly unneeded memory
> allocation.
> I thought that System.arraycopy() would somehow compensate the need to
> traverse the array twice.
> However testing shows that my code works a bit faster at least when
> dealing with Integer arrays of size from 1 to 100.
>
> Sincerely,
> Ivan
>
> On 02.04.2013 23:25, Stanimir Simeonoff wrote:
>
>> The current version is cache oblivious. In any case for smaller arrays
>> (like COW) System.arrayCopy won't yield any noticeable difference.
>> Also, iirc System.arrayCopy places a memory barrier which in the COW case
>> is unneeded.
>>
>> Stanimir
>>
>>
>>
>> On Tue, Apr 2, 2013 at 9:53 PM, Ivan Gerasimov <ivan.gerasimov at oracle.com<mailto:
>> ivan.gerasimov at oracle.**com <ivan.gerasimov at oracle.com>>> wrote:
>>
>>     Hello everybody!
>>
>>     Please review my proposal for the
>>     CopyOnWriteArrayList.**addIfAbsent() method optimization.
>>
>>     http://washi.ru.oracle.com/~**igerasim/webrevs/8011215/**
>> webrev/index.html<http://washi.ru.oracle.com/~igerasim/webrevs/8011215/webrev/index.html>
>>     <http://washi.ru.oracle.com/%**7Eigerasim/webrevs/8011215/**
>> webrev/index.html<http://washi.ru.oracle.com/%7Eigerasim/webrevs/8011215/webrev/index.html>
>> >
>>
>>
>>     Here is the original function body:
>>     ------------------------------**------------------
>>         Object[] elements = getArray();
>>         int len = elements.length;
>>         Object[] newElements = new Object[len + 1]; <-- allocate new
>>     array in advance
>>         for (int i = 0; i < len; ++i) {
>>             if (eq(e, elements[i]))                 <-- check whether
>>     e is null on every iteration
>>                 return false; // exit, throwing away copy
>>             else
>>                 newElements[i] = elements[i];       <-- copy elements
>>     one by one
>>         }
>>         newElements[len] = e;
>>         setArray(newElements);
>>     ------------------------------**------------------
>>     The proposed change is to reuse CopyOnWriteArrayList.indexOf()
>>     function to check if e is already in the array.
>>     If the check passed, new array is allocated withArrays.copyOf().
>>     It uses native System.arraycopy(), which is probably faster than
>>     copying elements in the loop.
>>
>>     Sincerely yours,
>>     Ivan
>>
>>     ______________________________**_________________
>>     Concurrency-interest mailing list
>>     Concurrency-interest at cs.**oswego.edu<Concurrency-interest at cs.oswego.edu>
>>     <mailto:Concurrency-interest@**cs.oswego.edu<Concurrency-interest at cs.oswego.edu>
>> >
>>     http://cs.oswego.edu/mailman/**listinfo/concurrency-interest<http://cs.oswego.edu/mailman/listinfo/concurrency-interest>
>>
>>
>>
>


-- 
Louis Wasserman



More information about the core-libs-dev mailing list