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