diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-12-14 16:43:50 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-12-14 18:18:14 +0000 |
commit | ad4a767e91bfd4a9b3617e5e6fef25fe3d5c59cf (patch) | |
tree | fa5c5fb14903eb895b0e89daae6cce9acaeb46bd /searchlib/src | |
parent | 6f0cc5cac45ba97c6365aafde252ff1d1a80f088 (diff) |
- Separate hot/cold path to enable compiler to make an even leaner hot path.
Diffstat (limited to 'searchlib/src')
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp | 26 | ||||
-rw-r--r-- | searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h | 8 |
2 files changed, 20 insertions, 14 deletions
diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp index fdf4ec950dd..331f01d4a82 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.cpp @@ -63,24 +63,24 @@ MultiBitVector<Update>::MultiBitVector(size_t reserved) template<typename Update> bool -MultiBitVector<Update>::updateLastValue(uint32_t docId) noexcept +MultiBitVector<Update>::updateLastValueCold(uint32_t docId) noexcept { - if (docId >= _lastMaxDocIdLimit) { - if (__builtin_expect(isAtEnd(docId), false)) { - return true; - } - const uint32_t index(BitWord::wordNum(docId)); - if (docId >= _lastMaxDocIdLimitRequireFetch) { - uint32_t baseIndex = index & ~(NumWordsInBatch - 1); - _update(_accel, baseIndex*sizeof(Word), _bvs, _lastWords); - _lastMaxDocIdLimitRequireFetch = (baseIndex + NumWordsInBatch) * BitWord::WordLen; - } - _lastValue = _lastWords[index % NumWordsInBatch]; - _lastMaxDocIdLimit = (index + 1) * BitWord::WordLen; + if (__builtin_expect(isAtEnd(docId), false)) { + return true; } + const uint32_t index(BitWord::wordNum(docId)); + if (docId >= _lastMaxDocIdLimitRequireFetch) { + uint32_t baseIndex = index & ~(NumWordsInBatch - 1); + _update(_accel, baseIndex*sizeof(Word), _bvs, _lastWords); + _lastMaxDocIdLimitRequireFetch = (baseIndex + NumWordsInBatch) * BitWord::WordLen; + } + _lastValue = _lastWords[index % NumWordsInBatch]; + _lastMaxDocIdLimit = (index + 1) * BitWord::WordLen; return false; } + + template<typename Update> uint32_t MultiBitVector<Update>::strictSeek(uint32_t docId) noexcept diff --git a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h index 2b4f90544ac..66598e28e3e 100644 --- a/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h +++ b/searchlib/src/vespa/searchlib/queryeval/multibitvectoriterator.h @@ -37,7 +37,13 @@ public: bool seek(uint32_t docId) noexcept; bool acceptExtraFilter() const noexcept { return Update::isAnd(); } private: - bool updateLastValue(uint32_t docId) noexcept; + bool updateLastValue(uint32_t docId) noexcept { + if (docId >= _lastMaxDocIdLimit) { + return updateLastValueCold(docId); + } + return false; + } + VESPA_DLL_LOCAL bool updateLastValueCold(uint32_t docId) noexcept __attribute__((noinline)); using IAccelrated = vespalib::hwaccelrated::IAccelrated; Update _update; |