]> source.dussan.org Git - vaadin-framework.git/commitdiff
Cache connector state types (#18437)
authorLeif Åstrand <leif@vaadin.com>
Wed, 8 Jul 2015 07:44:35 +0000 (10:44 +0300)
committerVaadin Code Review <review@vaadin.com>
Sat, 11 Jul 2015 13:30:23 +0000 (13:30 +0000)
Reduces time spent in findStateType() for the "40 layouts" action in
BasicPerformanceTest from around 2 ms to around 0.2 ms. This improves
the total performance of the action by about 5%.

Change-Id: I4f979827b2da0d4db87e201fa78421e5551a4113

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

index 0655b482edc30325f416e2598f13078831ffc28c..b6bcebd16780d18e3c2b33cbe2e5469c485e1fcf 100644 (file)
@@ -30,6 +30,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.logging.Logger;
 
 import com.vaadin.event.EventRouter;
@@ -91,6 +92,8 @@ public abstract class AbstractClientConnector implements ClientConnector,
 
     private ErrorHandler errorHandler = null;
 
+    private static final ConcurrentHashMap<Class<? extends AbstractClientConnector>, Class<? extends SharedState>> stateTypeCache = new ConcurrentHashMap<Class<? extends AbstractClientConnector>, Class<? extends SharedState>>();
+
     @Override
     public void addAttachListener(AttachListener listener) {
         addListener(AttachEvent.ATTACH_EVENT_IDENTIFIER, AttachEvent.class,
@@ -296,7 +299,12 @@ public abstract class AbstractClientConnector implements ClientConnector,
         // Lazy load because finding type can be expensive because of the
         // exceptions flying around
         if (stateType == null) {
-            stateType = findStateType();
+            // Cache because we don't need to do this once per instance
+            stateType = stateTypeCache.get(this.getClass());
+            if (stateType == null) {
+                stateType = findStateType();
+                stateTypeCache.put(this.getClass(), stateType);
+            }
         }
 
         return stateType;