From 3f27e02f121c0a39b217532afcf9530bfd2caba7 Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Sat, 10 Jan 2015 13:36:51 +0200 Subject: 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 --- .../vaadin/server/LegacyCommunicationManager.java | 33 ++++++++++++++-------- 1 file 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, JsonValue> referenceDiffStates = new ConcurrentHashMap, 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 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 -- cgit v1.2.3