From 64e8c2a24b8d7e76e420ea52d5b764fbd2f22e4b Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Fri, 22 Oct 2021 14:33:25 +0000 Subject: No need to reserve space for arith operand for strings. --- .../src/vespa/searchlib/attribute/attributevector.h | 21 ++++++++++----------- .../vespa/searchlib/attribute/attributevector.hpp | 2 +- .../src/vespa/searchlib/attribute/changevector.h | 16 ++++++++-------- .../searchlib/attribute/singleboolattribute.cpp | 2 +- .../searchlib/attribute/singlenumericattribute.hpp | 2 +- .../attribute/singlenumericenumattribute.hpp | 4 ++-- .../attribute/singlenumericpostattribute.hpp | 2 +- .../attribute/singlesmallnumericattribute.cpp | 2 +- 8 files changed, 25 insertions(+), 26 deletions(-) diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.h b/searchlib/src/vespa/searchlib/attribute/attributevector.h index bb88b168474..f5a79c3637e 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.h +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.h @@ -357,23 +357,22 @@ protected: static double round(double v, double & r) { return r = v; } static largeint_t round(double v, largeint_t &r) { return r = static_cast(::floor(v+0.5)); } - template + template static BaseType - applyArithmetic(const BaseType &value, const ChangeTemplate & arithmetic) + applyArithmetic(const BaseType &value, double operand, ChangeBase::Type type) { - typedef typename ChangeData::DataType LargeType; if (attribute::isUndefined(value)) { return value; - } else if (arithmetic._type == ChangeBase::ADD) { - return value + static_cast(arithmetic._arithOperand); - } else if (arithmetic._type == ChangeBase::SUB) { - return value - static_cast(arithmetic._arithOperand); - } else if (arithmetic._type == ChangeBase::MUL) { + } else if (type == ChangeBase::ADD) { + return value + static_cast(operand); + } else if (type == ChangeBase::SUB) { + return value - static_cast(operand); + } else if (type == ChangeBase::MUL) { LargeType r; - return round((static_cast(value) * arithmetic._arithOperand), r); - } else if (arithmetic._type == ChangeBase::DIV) { + return round((static_cast(value) * operand), r); + } else if (type == ChangeBase::DIV) { LargeType r; - return round(static_cast(value) / arithmetic._arithOperand, r); + return round(static_cast(value) / operand, r); } return value; } diff --git a/searchlib/src/vespa/searchlib/attribute/attributevector.hpp b/searchlib/src/vespa/searchlib/attribute/attributevector.hpp index 25658401f21..623e10ef052 100644 --- a/searchlib/src/vespa/searchlib/attribute/attributevector.hpp +++ b/searchlib/src/vespa/searchlib/attribute/attributevector.hpp @@ -116,7 +116,7 @@ AttributeVector::applyArithmetic(ChangeVectorT< ChangeTemplate > & changes, D _status.incNonIdempotentUpdates(diff); _status.incUpdates(diff); if (diff > 0) { - changes.back()._arithOperand = aop; + changes.back()._data.setArithOperand(aop); } return true; } diff --git a/searchlib/src/vespa/searchlib/attribute/changevector.h b/searchlib/src/vespa/searchlib/attribute/changevector.h index 12ac77febb9..f1fb58eb9d0 100644 --- a/searchlib/src/vespa/searchlib/attribute/changevector.h +++ b/searchlib/src/vespa/searchlib/attribute/changevector.h @@ -31,16 +31,14 @@ struct ChangeBase { _type(NOOP), _doc(0), _weight(1), - _enumScratchPad(UNSET_ENUM), - _arithOperand(0) + _enumScratchPad(UNSET_ENUM) { } ChangeBase(Type type, uint32_t d, int32_t w = 1) : _type(type), _doc(d), _weight(w), - _enumScratchPad(UNSET_ENUM), - _arithOperand(0) + _enumScratchPad(UNSET_ENUM) { } int cmp(const ChangeBase &b) const { int diff(_doc - b._doc); return diff; } @@ -53,19 +51,21 @@ struct ChangeBase { uint32_t _doc; int32_t _weight; mutable uint32_t _enumScratchPad; - double _arithOperand; }; template class NumericChangeData { private: - T _v; + double _arithOperand; + T _v; public: typedef T DataType; - NumericChangeData(T v) : _v(v) { } - NumericChangeData() : _v(T()) { } + NumericChangeData(T v) : _arithOperand(0), _v(v) { } + NumericChangeData() : _arithOperand(0), _v(T()) { } + double getArithOperand() const { return _arithOperand; } + void setArithOperand(double operand) { _arithOperand = operand; } T get() const { return _v; } T raw() const { return _v; } operator T() const { return _v; } diff --git a/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp index 9a71248a53d..3fe7d147c1d 100644 --- a/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/singleboolattribute.cpp @@ -66,7 +66,7 @@ SingleBoolAttribute::onCommit() { setBit(change._doc, change._data != 0); } else if ((change._type >= ChangeBase::ADD) && (change._type <= ChangeBase::DIV)) { std::atomic_thread_fence(std::memory_order_release); - int8_t val = applyArithmetic(getFast(change._doc), change); + int8_t val = applyArithmetic(getFast(change._doc), change._data.getArithOperand(), change._type); setBit(change._doc, val != 0); } else if (change._type == ChangeBase::CLEARDOC) { std::atomic_thread_fence(std::memory_order_release); diff --git a/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp b/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp index 4f2be68683d..cbff4d0e361 100644 --- a/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/singlenumericattribute.hpp @@ -43,7 +43,7 @@ SingleValueNumericAttribute::onCommit() _data[change._doc] = change._data; } else if (change._type >= ChangeBase::ADD && change._type <= ChangeBase::DIV) { std::atomic_thread_fence(std::memory_order_release); - _data[change._doc] = this->applyArithmetic(_data[change._doc], change); + _data[change._doc] = applyArithmetic(_data[change._doc], change._data.getArithOperand(), change._type); } else if (change._type == ChangeBase::CLEARDOC) { std::atomic_thread_fence(std::memory_order_release); _data[change._doc] = this->_defaultValue._data; diff --git a/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp b/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp index 55a82210a96..585b4514ba4 100644 --- a/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/singlenumericenumattribute.hpp @@ -34,7 +34,7 @@ SingleValueNumericEnumAttribute::considerArithmeticAttributeChange(const Chan oldValue = get(c._doc); } - T newValue = this->applyArithmetic(oldValue, c); + T newValue = applyArithmetic(oldValue, c._data.getArithOperand(), c._type); EnumIndex idx; if (!this->_enumStore.find_index(newValue, idx)) { @@ -52,7 +52,7 @@ SingleValueNumericEnumAttribute::applyArithmeticValueChange(const Change& c, { EnumIndex oldIdx = this->_enumIndices[c._doc]; EnumIndex newIdx; - T newValue = this->applyArithmetic(get(c._doc), c); + T newValue = applyArithmetic(get(c._doc), c._data.getArithOperand(), c._type); this->_enumStore.find_index(newValue, newIdx); this->updateEnumRefCounts(c, newIdx, oldIdx, updater); diff --git a/searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp b/searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp index 12138b0cfbc..5a610cc3da8 100644 --- a/searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp +++ b/searchlib/src/vespa/searchlib/attribute/singlenumericpostattribute.hpp @@ -102,7 +102,7 @@ SingleValueNumericPostingAttribute::applyValueChanges(EnumStoreBatchUpdater& } else if (change._type >= ChangeBase::ADD && change._type <= ChangeBase::DIV) { if (oldIdx.valid()) { T oldValue = enumStore.get_value(oldIdx); - T newValue = this->applyArithmetic(oldValue, change); + T newValue = applyArithmetic(oldValue, change._data.getArithOperand(), change._type); EnumIndex newIdx; (void) dictionary.find_index(enumStore.make_comparator(newValue), newIdx); currEnumIndices[change._doc] = newIdx; diff --git a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp index 9346bc43370..24dec664547 100644 --- a/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp +++ b/searchlib/src/vespa/searchlib/attribute/singlesmallnumericattribute.cpp @@ -60,7 +60,7 @@ SingleValueSmallNumericAttribute::onCommit() set(change._doc, change._data); } else if (change._type >= ChangeBase::ADD && change._type <= ChangeBase::DIV) { std::atomic_thread_fence(std::memory_order_release); - set(change._doc, applyArithmetic(getFast(change._doc), change)); + set(change._doc, applyArithmetic(getFast(change._doc), change._data.getArithOperand(), change._type)); } else if (change._type == ChangeBase::CLEARDOC) { std::atomic_thread_fence(std::memory_order_release); set(change._doc, 0u); -- cgit v1.2.3