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

Ivan Gerasimov ivan.gerasimov at oracle.com
Tue Apr 2 22:25:31 UTC 2013


Sure!

Attached please find an archive with the tests.
Actually they are quite naive - they simply run the code snippet in loop 
for several hundreds times.

Sincerely,
Ivan

On 03.04.2013 1:49, Louis Wasserman wrote:
> 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 <mailto: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>
>         <mailto:ivan.gerasimov at oracle.com
>         <mailto: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/%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
>         <mailto:Concurrency-interest at cs.oswego.edu>
>             <mailto:Concurrency-interest at cs.oswego.edu
>         <mailto:Concurrency-interest at cs.oswego.edu>>
>         http://cs.oswego.edu/mailman/listinfo/concurrency-interest
>
>
>
>
>
>
> -- 
> Louis Wasserman



More information about the core-libs-dev mailing list