[ 
https://issues.apache.org/jira/browse/FLEX-34759?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

shane doolan updated FLEX-34759:
--------------------------------
    Description: 
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"


  was:
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

The trade-off is for purely random add/removes, where the extra logic increases 
the times taken slightly. For us, addItem is the major use case - this patch 
speeds up population of all of our ArrayCollections considerably. 

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"



> ArrayList 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
>
>
> 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