diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2024-01-11 18:43:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-11 18:43:19 +0100 |
commit | c4e969f53aea43fc24c2205ef720170e4d793f1e (patch) | |
tree | a47f3a9be127195c59646abac89dac0d62a2fe13 /searchlib | |
parent | 5765524f5b09c8df51172fdfcb65952532f7fae1 (diff) | |
parent | b7fb2d9f78a6b54eddacc93d9c651c6de56fe2e4 (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.cpp | 15 |
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); |