You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@flex.apache.org by "Alex Harui (JIRA)" <ji...@apache.org> on 2015/02/23 09:50:11 UTC

[jira] [Commented] (FLEX-34759) ArrayList/ArrayCollection performance improvements

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

Alex Harui commented on FLEX-34759:
-----------------------------------

Thanks for the patch.  There was a discussion on the dev@flex.apache.org mailing list.  It's great to see that you found some optimizations for certain scenarios.  What is troubling is the degradation for the "random" case.  For backward compatibility reasons, I'm concerned that taking this patch would make some people happy but others unhappy.

First, I want to confirm that your timings were done on a release player with a release SWF, not a debugger player running a debuggable SWF.  If not, can you get new numbers with such a configuration?

If so, I would like your thoughts on:

1) A further potential optimization where, instead of using:
    if (index == length)
you instead use:
    if (index == _source.length)
  
Doing so might break folks who have overridden ArrayList's source property, but it would be interesting to see if all of the code that runs in the source and length getters is the culprit for the degradation in the "random" case.

2) Another alternative is that you just contribute a subclass of ArrayList called something like ArrayListWithFastFirstAndLastAddItem with your optimizations in that subclass.  That way folks who can benefit from your patch can opt-in, and we know nobody will get burned by any degradations.

Thanks,
-Alex

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