]> source.dussan.org Git - vaadin-framework.git/commitdiff
Optimize getAllChildrenIterable() performance. (#13803)
authorFabian Lange <lange.fabian@gmail.com>
Wed, 21 May 2014 12:52:52 +0000 (14:52 +0200)
committerSauli Tähkäpää <sauli@vaadin.com>
Tue, 27 May 2014 06:28:58 +0000 (09:28 +0300)
getAllChildrenIterable() is invoked frequently, its used by
attach/detach and markAsDirty.
Because of the implementation detail in CombinedIterator, on every call
all iterators are checked. This means that on every component which has
multiple childs, each next() call will first check the extension
iterator, before advancing in the child iterator.
By having the childs first, this overhead is reduced. If no extensions
are existing (which is quite common) the iterator is not added at all.
(creating an iterator on an empty UnmodifiableCollection is waste of
time and memory)

Change-Id: I23bb91464052ad4282963ec4b5be8a52c6847d4f

server/src/com/vaadin/server/AbstractClientConnector.java

index 1e58fb30c067c4a403fc31ebf62ccba8ba4ce8c7..92c235167cb3f47d80ca1274f6ebfc0f183e0854 100644 (file)
@@ -348,13 +348,16 @@ public abstract class AbstractClientConnector implements ClientConnector,
         @Override
         public Iterator<ClientConnector> iterator() {
             CombinedIterator<ClientConnector> iterator = new CombinedIterator<ClientConnector>();
-            iterator.addIterator(connector.getExtensions().iterator());
 
             if (connector instanceof HasComponents) {
                 HasComponents hasComponents = (HasComponents) connector;
                 iterator.addIterator(hasComponents.iterator());
             }
 
+            Collection<Extension> extensions = connector.getExtensions();
+            if (extensions.size() > 0) {
+                iterator.addIterator(extensions.iterator());
+            }
             return iterator;
         }
     }