Hi +1 to change to plain old indices. One curious thing to note is Trinidad variant uses plain old indices to do its own stuff. See:
http://svn.apache.org/repos/asf/myfaces/trinidad/trunk/trinidad-api/src/main/java/org/apache/myfaces/trinidad/component/ChildArrayList.java Trinidad stuff is rock solid, well tested and with a lot of performance hacks. So I think use plain old indices for all critical iteration code is our best bet. regards, Leonardo Uribe 2011/5/10 Blake Sullivan <blake.sulli...@oracle.com>: > > 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 >>> >>> > >