flex-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "shane doolan (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (FLEX-34759) ArrayList performance improvements
Date Fri, 20 Feb 2015 03:54:11 GMT

     [ 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)

Mime
View raw message