[concurrency-interest] RFR [8011215] optimization of CopyOnWriteArrayList.addIfAbsent() (original) (raw)
Ivan Gerasimov ivan.gerasimov at oracle.com
Tue Apr 2 21:34:50 UTC 2013
- Previous message: RFR [8011215] optimization of CopyOnWriteArrayList.addIfAbsent()
- Next message: [concurrency-interest] RFR [8011215] optimization of CopyOnWriteArrayList.addIfAbsent()
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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>> 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> 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> http://cs.oswego.edu/mailman/listinfo/concurrency-interest
- Previous message: RFR [8011215] optimization of CopyOnWriteArrayList.addIfAbsent()
- Next message: [concurrency-interest] RFR [8011215] optimization of CopyOnWriteArrayList.addIfAbsent()
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]