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

shane doolan updated FLEX-34765:
--------------------------------
    Description: 
ListCollectionView immediatly adds a CollectionEvent listener to its source 
list, even though it only needs the events if sort is set, filterFunction is 
set, or it has a CollectionEvent listener of its own.

ArrayList suppresses CollectionEvent creation if there is no CollectionEvent 
listener, so by only adding the listener when needed we can improve performance 
while reducing the number of CollectionEvent/Array allocations.

Performance profiling of the patch:

||label||type||objectCount||addItemAtStart||addItemAtEnd||addItemAtRandom||removeItemAtStart||removeItemAtEnd||removeItemAtRandom||
|Original ArrayCollection: original ArrayList|class 
ArrayCollection|100000|2538.556ms|2575.138ms|3268.842ms|3095.744ms|2555.533ms|2828.339ms|
|Patched ArrayCollection: original ArrayList|class 
ArrayCollectionListenerPatch|100000|2339.321ms|2338.553ms|3080.970ms|2927.168ms|2364.032ms|2706.899ms|
|Patched ArrayCollection: original ArrayList + CollectionEvent listener|class 
ArrayCollectionListenerPatch|100000|2561.900ms|2521.983ms|3262.963ms|3149.099ms|2533.680ms|2884.201ms|

Performance profiling of the patch with the patched ArrayList from [FLEX-34759]:

||label||type||objectCount||addItemAtStart||addItemAtEnd||addItemAtRandom||removeItemAtStart||removeItemAtEnd||removeItemAtRandom||
|Original ArrayCollection: patched ArrayList|class 
ArrayCollection|100000|240.839ms|273.501ms|3296.476ms|926.919ms|208.949ms|2856.562ms|
|Patched ArrayCollection: patched ArrayList|class 
ArrayCollectionListenerPatch|100000|62.039ms|65.500ms|3131.238ms|706.865ms|36.314ms|2676.732ms|
|Patched ArrayCollection: patched ArrayList + CollectionEvent listener|class 
ArrayCollectionListenerPatch|100000|298.581ms|243.448ms|3282.985ms|935.452ms|228.865ms|2880.552ms|

In the above examples: when the patched ArrayCollection doesn't have a 
CollectionEvent listener, sort, or filter we avoid allocation of 200,000 unused 
CollectionEvents (2 for each add/remove - one dispatched by the array list to 
the ListCollectionView, one cloned by the ListCollectionView and dispatched to 
nobody)



  was:
ListCollectionView immediatly adds a CollectionEvent listener to its source 
list, even though it only needs the events if sort is set, filterFunction is 
set, or it has a CollectionEvent listener of its own.

ArrayList suppresses CollectionEvent creation if there is no CollectionEvent
listener, so by only adding the listener when needed we get performance 
improvements and a reducing the number of CollectionEvent/Array allocations.

Performance profiling of the patch:

||label||type||objectCount||addItemAtStart||addItemAtEnd||addItemAtRandom||removeItemAtStart||removeItemAtEnd||removeItemAtRandom||
|Original ArrayCollection: original ArrayList|class 
ArrayCollection|100000|2538.556ms|2575.138ms|3268.842ms|3095.744ms|2555.533ms|2828.339ms|
|Patched ArrayCollection: original ArrayList|class 
ArrayCollectionListenerPatch|100000|2339.321ms|2338.553ms|3080.970ms|2927.168ms|2364.032ms|2706.899ms|
|Patched ArrayCollection: original ArrayList + CollectionEvent listener|class 
ArrayCollectionListenerPatch|100000|2561.900ms|2521.983ms|3262.963ms|3149.099ms|2533.680ms|2884.201ms|

Performance profiling of the patch with the patched ArrayList from [FLEX-34759]:

||label||type||objectCount||addItemAtStart||addItemAtEnd||addItemAtRandom||removeItemAtStart||removeItemAtEnd||removeItemAtRandom||
|Original ArrayCollection: patched ArrayList|class 
ArrayCollection|100000|240.839ms|273.501ms|3296.476ms|926.919ms|208.949ms|2856.562ms|
|Patched ArrayCollection: patched ArrayList|class 
ArrayCollectionListenerPatch|100000|62.039ms|65.500ms|3131.238ms|706.865ms|36.314ms|2676.732ms|
|Patched ArrayCollection: patched ArrayList + CollectionEvent listener|class 
ArrayCollectionListenerPatch|100000|298.581ms|243.448ms|3282.985ms|935.452ms|228.865ms|2880.552ms|

In the above examples the, when the patched ArrayCollection doesn't have a 
CollectionEvent listener, sort, or filter it avoids allocation of 200,000 
unused CollectionEvents (2 for each add/remove - one from the array list, one 
cloned by the ListCollectionView)




> ArrayCollection/ListCollectionView performance improvements
> -----------------------------------------------------------
>
>                 Key: FLEX-34765
>                 URL: https://issues.apache.org/jira/browse/FLEX-34765
>             Project: Apache Flex
>          Issue Type: Improvement
>          Components: Collections
>            Reporter: shane doolan
>              Labels: newbie, performance
>         Attachments: FLEX-34765.patch
>
>
> ListCollectionView immediatly adds a CollectionEvent listener to its source 
> list, even though it only needs the events if sort is set, filterFunction is 
> set, or it has a CollectionEvent listener of its own.
> ArrayList suppresses CollectionEvent creation if there is no CollectionEvent 
> listener, so by only adding the listener when needed we can improve 
> performance while reducing the number of CollectionEvent/Array allocations.
> Performance profiling of the patch:
> ||label||type||objectCount||addItemAtStart||addItemAtEnd||addItemAtRandom||removeItemAtStart||removeItemAtEnd||removeItemAtRandom||
> |Original ArrayCollection: original ArrayList|class 
> ArrayCollection|100000|2538.556ms|2575.138ms|3268.842ms|3095.744ms|2555.533ms|2828.339ms|
> |Patched ArrayCollection: original ArrayList|class 
> ArrayCollectionListenerPatch|100000|2339.321ms|2338.553ms|3080.970ms|2927.168ms|2364.032ms|2706.899ms|
> |Patched ArrayCollection: original ArrayList + CollectionEvent listener|class 
> ArrayCollectionListenerPatch|100000|2561.900ms|2521.983ms|3262.963ms|3149.099ms|2533.680ms|2884.201ms|
> Performance profiling of the patch with the patched ArrayList from 
> [FLEX-34759]:
> ||label||type||objectCount||addItemAtStart||addItemAtEnd||addItemAtRandom||removeItemAtStart||removeItemAtEnd||removeItemAtRandom||
> |Original ArrayCollection: patched ArrayList|class 
> ArrayCollection|100000|240.839ms|273.501ms|3296.476ms|926.919ms|208.949ms|2856.562ms|
> |Patched ArrayCollection: patched ArrayList|class 
> ArrayCollectionListenerPatch|100000|62.039ms|65.500ms|3131.238ms|706.865ms|36.314ms|2676.732ms|
> |Patched ArrayCollection: patched ArrayList + CollectionEvent listener|class 
> ArrayCollectionListenerPatch|100000|298.581ms|243.448ms|3282.985ms|935.452ms|228.865ms|2880.552ms|
> In the above examples: when the patched ArrayCollection doesn't have a 
> CollectionEvent listener, sort, or filter we avoid allocation of 200,000 
> unused CollectionEvents (2 for each add/remove - one dispatched by the array 
> list to the ListCollectionView, one cloned by the ListCollectionView and 
> dispatched to nobody)



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

Reply via email to