It's not dangerous or risky. It's just slower. It won't break anything. The common case is that this change will have better performance in all known situations.
I haven't looked at the code, but what about creating a static Iterator instead of creating a new one each time? Or picking whether to use iterator() or "for" based on the list type? On Tue, May 10, 2011 at 4:29 PM, Martin Koci <martin.kocicak.k...@gmail.com> wrote: > > Hi, > > yes, every List support indexes, but it dependes on implementation if > that index-based access is fast or not. For example, ArrayList is fast, > because it uses array internally; and also flags that with interface > java.util.RandomAccess > > But LinkedList for example just iterates the list until it reaches the > index you specified - there is the dangerous problem. > > > > Mike Kienenberger píše v Út 10. 05. 2011 v 16:17 -0400: >> 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 >> > >> > >> > > >