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 01:03:26 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

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"


  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:

        source.splice(index, 0, item);

      With this:
        
        if (index == length)
            source.push(item);
        else if (index == 0)
            source.unshift(item);
        else
            source.splice(index, 0, item);

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. 

Patch in on its way, 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
> 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"



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

Mime
View raw message