Performance improvement in deserialization of EncodableDiscreteResources
Over 1500x faster. This is for ONOS-4698
Before this patch
Benchmark Mode Cnt Score Error Units
VlanSetSerialize.deserialize_compact_vlans avgt 200 1681.625 ± 8.937 us/op
VlanSetSerialize.serialize_compact_vlans avgt 200 1.532 ± 0.017 us/op
After this patch
Benchmark Mode Cnt Score Error Units
VlanSetSerialize.deserialize_compact_vlans avgt 200 1.070 ± 0.012 us/op
VlanSetSerialize.serialize_compact_vlans avgt 200 1.613 ± 0.014 us/op
Change-Id: I2f00f7fbf25ee36555751e0bcff95d06b701f8c8
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
index 3dc12b3..125b5d9 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResources.java
@@ -66,7 +66,7 @@
return new EncodableDiscreteResources(parent, values);
}
- private EncodableDiscreteResources(DiscreteResource parent, Map<Class<?>, EncodedDiscreteResources> map) {
+ EncodableDiscreteResources(DiscreteResource parent, Map<Class<?>, EncodedDiscreteResources> map) {
this.parent = parent;
this.map = map;
}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
index 8c39e31..83bc342 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodableDiscreteResourcesSerializer.java
@@ -21,8 +21,10 @@
import com.esotericsoftware.kryo.io.Output;
import org.onosproject.net.resource.DiscreteResource;
+import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Set;
+import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -41,9 +43,11 @@
@SuppressWarnings("unchecked")
Set<EncodedDiscreteResources> resources = kryo.readObject(input, LinkedHashSet.class);
- return EncodableDiscreteResources.of(parent,
- resources.stream()
- .flatMap(x -> x.values(parent.id()).stream())
- .collect(Collectors.toCollection(LinkedHashSet::new)));
+ return new EncodableDiscreteResources(parent, resources.stream()
+ .collect(Collectors.toMap(
+ EncodedDiscreteResources::encodedClass,
+ Function.identity(),
+ (v1, v2) -> v1,
+ LinkedHashMap::new)));
}
}
diff --git a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
index d02e91c..e5bf85a 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/resource/impl/EncodedDiscreteResources.java
@@ -76,6 +76,11 @@
.collect(Collectors.toCollection(LinkedHashSet::new));
}
+ Class<?> encodedClass() {
+ Range<Integer> firstRange = rangeSet.asRanges().iterator().next();
+ return codec.decode(firstRange.lowerEndpoint()).getClass();
+ }
+
@SuppressWarnings("unchecked")
boolean contains(DiscreteResource resource) {
return resource.valueAs(Object.class)