diff options
author | Jon Bratseth <bratseth@gmail.com> | 2020-09-02 18:04:23 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2020-09-02 18:04:23 +0200 |
commit | e6f3bc58eb76d38ec80857c5d96f68a91eb115ec (patch) | |
tree | d69290f1344c1ae6cb27058f74d44268848bf66b /container-search | |
parent | ed218c46326f21ff78a03bffe425c4b0284dcb22 (diff) |
Optimize for looking up values that are present
At the cost of always attempting to decode a nonexisting value
we can skip the containsKey lookup, making double lookups in FeatureData
about 50% faster and on par with HashMap.
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/result/FeatureData.java | 24 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java | 6 |
2 files changed, 22 insertions, 8 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/result/FeatureData.java b/container-search/src/main/java/com/yahoo/search/result/FeatureData.java index f0637473ef5..dda8ba103c6 100644 --- a/container-search/src/main/java/com/yahoo/search/result/FeatureData.java +++ b/container-search/src/main/java/com/yahoo/search/result/FeatureData.java @@ -74,10 +74,14 @@ public class FeatureData implements Inspectable, JsonProducer { * (that is, if it is a tensor with nonzero rank) */ public Double getDouble(String featureName) { - if (decodedDoubles != null && decodedDoubles.containsKey(featureName)) - return decodedDoubles.get(featureName); - Double value = decodeDouble(featureName); - if (decodedDoubles == null) + Double value = null; + if (decodedDoubles != null) + value = decodedDoubles.get(featureName); + if (value != null) + return value; + + value = decodeDouble(featureName); + if (value != null && decodedDoubles == null) decodedDoubles = new HashMap<>(); decodedDoubles.put(featureName, value); return value; @@ -99,10 +103,14 @@ public class FeatureData implements Inspectable, JsonProducer { * This will return any feature value: Scalars are returned as a rank 0 tensor. */ public Tensor getTensor(String featureName) { - if (decodedTensors != null && decodedTensors.containsKey(featureName)) - return decodedTensors.get(featureName); - Tensor value = decodeTensor(featureName); - if (decodedTensors == null) + Tensor value = null; + if (decodedTensors != null) + value = decodedTensors.get(featureName); + if (value != null) + return value; + + value = decodeTensor(featureName); + if (value != null && decodedTensors == null) decodedTensors = new HashMap<>(); decodedTensors.put(featureName, value); return value; diff --git a/container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java b/container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java index f9b89b64e5b..d68d13a40ba 100644 --- a/container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java +++ b/container-search/src/test/java/com/yahoo/search/result/FeatureDataTestCase.java @@ -11,6 +11,7 @@ import org.junit.Test; import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * @author bratseth @@ -35,11 +36,16 @@ public class FeatureDataTestCase { assertEquals(1.5, featureData.getDouble("scalar1"), delta); assertEquals(2.5, featureData.getDouble("scalar2"), delta); assertEquals("Cached lookup", 2.5, featureData.getDouble("scalar2"), delta); + assertNull(featureData.getDouble("nosuch")); + assertNull(featureData.getDouble("nosuch")); + assertEquals(Tensor.from(1.5), featureData.getTensor("scalar1")); assertEquals(Tensor.from(2.5), featureData.getTensor("scalar2")); assertEquals(tensor1, featureData.getTensor("tensor1")); assertEquals(tensor2, featureData.getTensor("tensor2")); assertEquals("Cached lookup", tensor2, featureData.getTensor("tensor2")); + assertNull(featureData.getTensor("nosuch")); + assertNull(featureData.getTensor("nosuch")); String expectedJson = "{" + |