diff options
author | Leif Åstrand <leif@vaadin.com> | 2015-01-10 13:36:51 +0200 |
---|---|---|
committer | Vaadin Code Review <review@vaadin.com> | 2015-01-12 08:24:53 +0000 |
commit | 3f27e02f121c0a39b217532afcf9530bfd2caba7 (patch) | |
tree | 6ea5ebd67de5b7839ab80026ef1b7e432087b74a | |
parent | 65904ffbdebc861a45c1b504d244d02a12f4561b (diff) | |
download | vaadin-framework-3f27e02f121c0a39b217532afcf9530bfd2caba7.tar.gz vaadin-framework-3f27e02f121c0a39b217532afcf9530bfd2caba7.zip |
Cache reference diffstate values (#15561)
Benchmarked with the "Set 40 panels as content" action in
BasicPerformanceTest. This is really a worst case scenario since it
doesn't do anything else than create lots of components, whereas more
common use cases would spend more time updating existing components or
executing business logic instead.
Without this patch, each action spent about 6 ms creating reference
diffstate values, making up about 20% of the total processing time. With
the patch applied, the time (including the new map lookup) was reduced
to around 0.2 ms and the total processing time was also reduced
accordingly.
Change-Id: If22a73b591b87793c78cb360bcfa8e030f003730
-rw-r--r-- | server/src/com/vaadin/server/LegacyCommunicationManager.java | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/server/src/com/vaadin/server/LegacyCommunicationManager.java b/server/src/com/vaadin/server/LegacyCommunicationManager.java index 485084b515..fda5ad444f 100644 --- a/server/src/com/vaadin/server/LegacyCommunicationManager.java +++ b/server/src/com/vaadin/server/LegacyCommunicationManager.java @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; @@ -81,6 +82,8 @@ public class LegacyCommunicationManager implements Serializable { return session; } + private static final ConcurrentHashMap<Class<? extends SharedState>, JsonValue> referenceDiffStates = new ConcurrentHashMap<Class<? extends SharedState>, JsonValue>(); + /** * @deprecated As of 7.1. See #11411. */ @@ -96,17 +99,10 @@ public class LegacyCommunicationManager implements Serializable { if (diffState == null && supportsDiffState) { // Use an empty state object as reference for full // repaints - - try { - SharedState referenceState = stateType.newInstance(); - EncodeResult encodeResult = JsonCodec.encode(referenceState, - null, stateType, uI.getConnectorTracker()); - diffState = encodeResult.getEncodedValue(); - } catch (Exception e) { - getLogger() - .log(Level.WARNING, - "Error creating reference object for state of type {0}", - stateType.getName()); + diffState = referenceDiffStates.get(stateType); + if (diffState == null) { + diffState = createReferenceDiffStateState(stateType); + referenceDiffStates.put(stateType, diffState); } } EncodeResult encodeResult = JsonCodec.encode(state, diffState, @@ -118,6 +114,21 @@ public class LegacyCommunicationManager implements Serializable { return (JsonObject) encodeResult.getDiff(); } + private static JsonValue createReferenceDiffStateState( + Class<? extends SharedState> stateType) { + try { + SharedState referenceState = stateType.newInstance(); + EncodeResult encodeResult = JsonCodec.encode(referenceState, null, + stateType, null); + return encodeResult.getEncodedValue(); + } catch (Exception e) { + getLogger().log(Level.WARNING, + "Error creating reference object for state of type {0}", + stateType.getName()); + return null; + } + } + /** * Resolves a dependency URI, registering the URI with this * {@code LegacyCommunicationManager} if needed and returns a fully |