summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2024-01-11 18:43:19 +0100
committerGitHub <noreply@github.com>2024-01-11 18:43:19 +0100
commitc4e969f53aea43fc24c2205ef720170e4d793f1e (patch)
treea47f3a9be127195c59646abac89dac0d62a2fe13 /searchlib
parent5765524f5b09c8df51172fdfcb65952532f7fae1 (diff)
parentb7fb2d9f78a6b54eddacc93d9c651c6de56fe2e4 (diff)
Merge pull request #29862 from vespa-engine/geirst/cache-docids-to-reduce-cache-misses
Cache docids from iterators to reduce cache misses.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp
index 214851e9681..a4cc7405bbf 100644
--- a/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp
+++ b/searchlib/src/vespa/searchlib/attribute/multi_term_or_filter_search.cpp
@@ -14,6 +14,9 @@ namespace search::attribute {
template<typename IteratorPack>
class MultiTermOrFilterSearchImpl : public MultiTermOrFilterSearch
{
+ // Vector that caches the docids of the current positions of the iterators in the pack.
+ // This reduces cache misses in doSeek() and seek_all().
+ std::vector<uint32_t> _docids;
IteratorPack _children;
fef::TermFieldMatchData* _tfmd;
void seek_all(uint32_t docId);
@@ -32,6 +35,9 @@ public:
void initRange(uint32_t begin, uint32_t end) override {
SearchIterator::initRange(begin, end);
_children.initRange(begin, end);
+ for (uint16_t i = 0; i < _children.size(); ++i) {
+ _docids[i] = _children.get_docid(i);
+ }
}
void or_hits_into(BitVector &result, uint32_t begin_id) override {
@@ -53,6 +59,7 @@ public:
template<typename IteratorPack>
MultiTermOrFilterSearchImpl<IteratorPack>::MultiTermOrFilterSearchImpl(IteratorPack&& children, fef::TermFieldMatchData* tfmd)
: MultiTermOrFilterSearch(),
+ _docids(children.size(), 0),
_children(std::move(children)),
_tfmd(tfmd)
{
@@ -65,9 +72,10 @@ template<typename IteratorPack>
void
MultiTermOrFilterSearchImpl<IteratorPack>::seek_all(uint32_t docId) {
for (uint16_t i = 0; i < _children.size(); ++i) {
- uint32_t next = _children.get_docid(i);
+ uint32_t next = _docids[i];
if (next < docId) {
- _children.seek(i, docId);
+ next = _children.seek(i, docId);
+ _docids[i] = next;
}
}
}
@@ -78,9 +86,10 @@ MultiTermOrFilterSearchImpl<IteratorPack>::doSeek(uint32_t docId)
{
uint32_t min_doc_id = endDocId;
for (uint16_t i = 0; i < _children.size(); ++i) {
- uint32_t next = _children.get_docid(i);
+ uint32_t next = _docids[i];
if (next < docId) {
next = _children.seek(i, docId);
+ _docids[i] = next;
}
if (next == docId) {
setDocId(next);