Mike,

What Martin is talking about is that if the List doesn't implement the Marker interface RandomAccess then the List may implement indexed-based access through iteration, in which case iterating the list is n^2/2

-- Blake Sullivan


On 5/10/11 1:17 PM, Mike Kienenberger wrote:
If getChildren() is always of type List, then it really doesn't matter
if it's ArrayList or ChildArrayList or some other kind of list.   You
can use indexes for any type of List.

On Tue, May 10, 2011 at 4:11 PM, Martin Koci
<martin.kocicak.k...@gmail.com>  wrote:
Hi,

in current codebase, myfaces use mostly enhanced loop for iterating over
chidren:

for (UIComponent child: getChildren())

that creates new instance of iterator.

After change to plain old indices:

for (i = 0; i<  childCount; i++)
  child = getChildren().get(i);

I achieved following results in my test case:

1) number of AbstractList$Itr from ~ 100 000 down to ~1500 instances per
one render/response

2) time for one render/response from ~1500ms down to ~900ms

please see https://issues.apache.org/jira/browse/MYFACES-3130 for more
details.

We know that getChildren() is type of ArrayList
(javax.faces.component._ComponentChildrenList) - in this situation is
index-based loop safe change.

But custom component can override implementation of getChildren() and
provide own implementation which can be slower: I know about Trinidad:
uses ArrayList  too, so no risk here
(org.apache.myfaces.trinidad.component.ChildArrayList)

I use RichFaces and PrimeFaces too and don't see custom implementation
of children in their codebase.

What do you think about this problem? The performance gain is pretty big
but also risky.


Regards,

Kočičák



Reply via email to