Optimize TerminationReason memory usage and performance 29/61229/4
authorRobert Varga <robert.varga@pantheon.tech>
Sat, 5 Aug 2017 23:54:10 +0000 (01:54 +0200)
committerClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Thu, 28 Dec 2017 22:01:40 +0000 (23:01 +0100)
Using a map is forcing us to box on each lookup. Given the cardinality
a simple array lookup is just fine.

Change-Id: Id39151267545e6c35a3c0b9997612879e9b88c65
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
pcep/api/src/main/java/org/opendaylight/protocol/pcep/TerminationReason.java

index 329ff67f09412f7054460f5d1b4f30f53f010474..3d07b79ef7f5ca07327ac0aab68a3aed135d910f 100644 (file)
@@ -7,47 +7,55 @@
  */
 package org.opendaylight.protocol.pcep;
 
-import com.google.common.collect.Maps;
-import java.util.Map;
+import static com.google.common.base.Verify.verify;
+
+import java.util.Arrays;
 
 public enum TerminationReason {
-    UNKNOWN((short) 1),
-    EXP_DEADTIMER((short) 2),
-    MALFORMED_MSG((short) 3),
-    TOO_MANY_UNKNWN_REQS((short) 4),
-    TOO_MANY_UNKNOWN_MSGS((short) 5);
+    UNKNOWN(1),
+    EXP_DEADTIMER(2),
+    MALFORMED_MSG(3),
+    TOO_MANY_UNKNWN_REQS(4),
+    TOO_MANY_UNKNOWN_MSGS(5);
 
-    private static final Map<Short, TerminationReason> VALUE_MAP;
+    private static final TerminationReason[] REASONS;
 
     static {
-        VALUE_MAP = Maps.newHashMap();
-        for (final TerminationReason enumItem : TerminationReason.values()) {
-            VALUE_MAP.put(enumItem.value, enumItem);
+        // We are not making many assumptions here
+        final TerminationReason[] reasons = TerminationReason.values();
+        verify(reasons.length > 0);
+
+        final short highest = Arrays.stream(reasons).map(TerminationReason::getShortValue).max(Short::compareTo).get();
+        final TerminationReason[] init = new TerminationReason[highest + 1];
+        for (TerminationReason reason : reasons) {
+            init[reason.getShortValue()] = reason;
         }
+
+        REASONS = init;
     }
 
     private short value;
 
-    TerminationReason(final short value) {
-        this.value = value;
+    TerminationReason(final int value) {
+        this.value = (short) value;
     }
 
     /**
-     * Gets termination reason for specific short value.
+     * Gets value of termination reason.
      *
-     * @param valueArg corresponding to Termination reason
-     * @return corresponding TerminationReason item
+     * @return short value
      */
-    public static TerminationReason forValue(final short valueArg) {
-        return VALUE_MAP.get(valueArg);
+    public short getShortValue() {
+        return value;
     }
 
     /**
-     * Gets value of termination reason.
+     * Gets termination reason for specific short value.
      *
-     * @return short value
+     * @param valueArg corresponding to Termination reason
+     * @return corresponding TerminationReason item
      */
-    public short getShortValue() {
-        return this.value;
+    public static TerminationReason forValue(final short valueArg) {
+        return valueArg < 0 || valueArg >= REASONS.length ? null : REASONS[valueArg];
     }
 }