[ 
https://issues.apache.org/jira/browse/FLEX-34759?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14335585#comment-14335585
 ] 

shane doolan commented on FLEX-34759:
-------------------------------------

For each add test, the list starts empty, timer starts, then X items are added. 
For each remove tests, the list starts with X items, timer starts, then X items 
are removed.

I expect the biggest benefits of this patch will be seen in ArrayCollection 
population, as internally ArrayCollection is using ArrayList to manage its 
source collection. 

If an app has a large number of ArrayCollections or a few large 
ArrayCollections being returned by a remote procedure (eg/ BlazeDS, LCDS, 
GraniteDS, WebOrb, etc) it will likely experience lag during as the result is 
de-serialised and the ArrayCollections are initialised. ArrayCollection.addItem 
gets called a lot!

For me, this patch has seen de-serialisation times more than halved. I hope 
others will see a similar improvements.



> ArrayList/ArrayCollection performance improvements
> --------------------------------------------------
>
>                 Key: FLEX-34759
>                 URL: https://issues.apache.org/jira/browse/FLEX-34759
>             Project: Apache Flex
>          Issue Type: Improvement
>          Components: Collections
>            Reporter: shane doolan
>              Labels: newbie, patch, performance
>         Attachments: FLEX-34759.patch, FLEX-34759_v2.patch, ListProfiler.zip
>
>
> Considerable performance gains can be achieved by avoiding the use of array 
> splice when adding/removing items from the start or end of the source array 
> in ArrayList.
> eg/ in ArrayList.addItemAt, replace this:
> {code}
> source.splice(index, 0, item);
> {code}
> with this:   
> {code} 
> if (index == length)
>     source.push(item);
> else if (index == 0)
>     source.unshift(item);
> else
>     source.splice(index, 0, item);
> {code}
> ArrayList.addItem is 10x faster when adding non IEventDispatcher's, and 6x 
> faster for IEventDispatcher's. There is a small trade-off when performing 
> random access add/removes, where the extra logic slightly increases the times 
> taken. 
> Since ArrayCollection wraps an ArrayList by default and 
> ArrayCollection.addItem is used extensively within our apps, this patch has 
> provided considerable performance improvements.
> See profiling results below:
> *Original ArrayList, adding/removing 100k ints*
> * addItemAtStart = "2434ms"
> * addItemAtEnd = "2501ms"
> * addItemAtRandom = "3149ms"
> * removeItemAtStart = "3098ms"
> * removeItemAtEnd = "2401ms"
> * removeItemAtRandom = "2606ms"
> *Original ArrayList, adding/removing 100k IEventDispatcher's*
> * addItemAtStart = "2501ms"
> * addItemAtEnd = "2505ms"
> * addItemAtRandom = "3165ms"
> * removeItemAtStart = "3053ms"
> * removeItemAtEnd = "2453ms"
> * removeItemAtRandom = "2709ms"
> *Patched ArrayList, adding/removing 100k ints*
> * addItemAtStart = "226ms"
> * addItemAtEnd = *"213ms"*
> * addItemAtRandom = "3281ms"
> * removeItemAtStart = "803ms"
> * removeItemAtEnd = "219ms"
> * removeItemAtRandom = "2808ms"
> *Patched ArrayList, adding/removing 100k IEventDispatcher's*
> * addItemAtStart = "415ms"
> * addItemAtEnd = *"488ms"*
> * addItemAtRandom = "3662ms"
> * removeItemAtStart = "878ms"
> * removeItemAtEnd = "264ms"
> * removeItemAtRandom = "2949ms"



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to