summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2018-01-09 17:30:33 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2018-01-09 17:30:33 +0100
commitf8a40c2fb5efa31e7a0b27c3d1385b05bcbfba91 (patch)
tree06eab069998c7974f466b9909924920b1d45076b /searchlib
parent180318a3f661c036c791b6739f10875ec0f27009 (diff)
Cache the end iterator as it now is created on the fly.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/features/dotproductfeature.cpp13
-rw-r--r--searchlib/src/vespa/searchlib/features/dotproductfeature.h7
2 files changed, 14 insertions, 6 deletions
diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp
index cbc8a5158a2..89e7e53e2f2 100644
--- a/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp
+++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.cpp
@@ -30,15 +30,22 @@ VectorBase<DimensionVType, DimensionHType, ComponentType, HashMapComparator>::Ve
template <typename DimensionVType, typename DimensionHType, typename ComponentType, typename HashMapComparator>
VectorBase<DimensionVType, DimensionHType, ComponentType, HashMapComparator>::~VectorBase() { }
+template <typename V>
+V copyAndSync(const V & v) {
+ V tmp(v);
+ tmp.syncMap();
+ return tmp;
+}
+
template <typename Vector, typename Buffer>
DotProductExecutor<Vector, Buffer>::DotProductExecutor(const IAttributeVector * attribute, const Vector & queryVector) :
FeatureExecutor(),
_attribute(attribute),
- _queryVector(queryVector),
+ _queryVector(copyAndSync(queryVector)),
+ _end(_queryVector.getDimMap().end()),
_buffer()
{
_buffer.allocate(_attribute->getMaxValueCount());
- _queryVector.syncMap();
}
template <typename Vector, typename Buffer>
@@ -50,7 +57,7 @@ DotProductExecutor<Vector, Buffer>::execute(uint32_t docId)
_buffer.fill(*_attribute, docId);
for (size_t i = 0; i < _buffer.size(); ++i) {
typename Vector::HashMap::const_iterator itr = _queryVector.getDimMap().find(_buffer[i].getValue());
- if (itr != _queryVector.getDimMap().end()) {
+ if (itr != _end) {
val += _buffer[i].getWeight() * itr->second;
}
}
diff --git a/searchlib/src/vespa/searchlib/features/dotproductfeature.h b/searchlib/src/vespa/searchlib/features/dotproductfeature.h
index 724a68e5268..27e96c26538 100644
--- a/searchlib/src/vespa/searchlib/features/dotproductfeature.h
+++ b/searchlib/src/vespa/searchlib/features/dotproductfeature.h
@@ -113,9 +113,10 @@ public:
template <typename Vector, typename Buffer>
class DotProductExecutor : public fef::FeatureExecutor {
private:
- const search::attribute::IAttributeVector * _attribute;
- Vector _queryVector;
- Buffer _buffer;
+ const attribute::IAttributeVector * _attribute;
+ const Vector _queryVector;
+ const typename Vector::HashMap::const_iterator _end;
+ Buffer _buffer;
public:
DotProductExecutor(const search::attribute::IAttributeVector * attribute, const Vector & queryVector);