summaryrefslogtreecommitdiffstats
path: root/searchlib/src/tests/postinglistbm
diff options
context:
space:
mode:
authorGeir Storli <geirst@verizonmedia.com>2019-05-06 12:01:05 +0000
committerGeir Storli <geirst@verizonmedia.com>2019-05-06 12:01:05 +0000
commit5c7a56c51a65636f026d534e52ec428902df0ffe (patch)
treedc4579a9cf849b4a6d01f2739b8ec69359139403 /searchlib/src/tests/postinglistbm
parent7e9e16f80db71694de5a0cca1cec871d8792546b (diff)
Avoid code duplication in fake match loop implementations.
Diffstat (limited to 'searchlib/src/tests/postinglistbm')
-rw-r--r--searchlib/src/tests/postinglistbm/andstress.cpp112
-rw-r--r--searchlib/src/tests/postinglistbm/postinglistbm.cpp156
2 files changed, 20 insertions, 248 deletions
diff --git a/searchlib/src/tests/postinglistbm/andstress.cpp b/searchlib/src/tests/postinglistbm/andstress.cpp
index 99c83bd090c..7152e2a3981 100644
--- a/searchlib/src/tests/postinglistbm/andstress.cpp
+++ b/searchlib/src/tests/postinglistbm/andstress.cpp
@@ -2,19 +2,20 @@
#include "andstress.h"
+#include <vespa/fastos/thread.h>
+#include <vespa/fastos/time.h>
#include <vespa/searchlib/common/bitvector.h>
+#include <vespa/searchlib/test/fakedata/fake_match_loop.h>
+#include <vespa/searchlib/test/fakedata/fakeegcompr64filterocc.h>
+#include <vespa/searchlib/test/fakedata/fakefilterocc.h>
+#include <vespa/searchlib/test/fakedata/fakeposting.h>
#include <vespa/searchlib/test/fakedata/fakeword.h>
#include <vespa/searchlib/test/fakedata/fakewordset.h>
-#include <vespa/searchlib/test/fakedata/fakeposting.h>
-#include <vespa/searchlib/test/fakedata/fakefilterocc.h>
-#include <vespa/searchlib/test/fakedata/fakeegcompr64filterocc.h>
-#include <vespa/searchlib/test/fakedata/fakezcfilterocc.h>
#include <vespa/searchlib/test/fakedata/fakezcbfilterocc.h>
+#include <vespa/searchlib/test/fakedata/fakezcfilterocc.h>
#include <vespa/searchlib/test/fakedata/fpfactory.h>
-#include <vespa/fastos/thread.h>
-#include <vespa/fastos/time.h>
-#include <mutex>
#include <condition_variable>
+#include <mutex>
#include <vector>
#include <vespa/log/log.h>
@@ -357,99 +358,14 @@ AndStressWorker::~AndStressWorker()
LOG(debug, "AndStressWorker::~AndStressWorker, id=%u", _id);
}
-static int
-highLevelAndPairPostingScan(SearchIterator &sb1,
- SearchIterator &sb2,
- uint32_t numDocs, uint64_t *cycles)
-{
- uint32_t hits = 0;
- uint64_t before = fastos::ClockSystem::now();
- sb1.initFullRange();
- sb2.initFullRange();
- uint32_t docId = sb1.getDocId();
- while (docId < numDocs) {
- if (sb1.seek(docId)) {
- if (sb2.seek(docId)) {
- ++hits;
- ++docId;
- } else if (docId < sb2.getDocId())
- docId = sb2.getDocId();
- else
- ++docId;
- } else if (docId < sb1.getDocId())
- docId= sb1.getDocId();
- else
- ++docId;
- }
- uint64_t after = fastos::ClockSystem::now();
- *cycles = after - before;
- return hits;
-}
-
-static int
-highLevelAndPairPostingScanUnpack(SearchIterator &sb1,
- SearchIterator &sb2,
- uint32_t numDocs,
- uint64_t *cycles)
-{
- uint32_t hits = 0;
- uint64_t before = fastos::ClockSystem::now();
- sb1.initFullRange();
- sb2.initFullRange();
- uint32_t docId = sb1.getDocId();
- while (docId < numDocs) {
- if (sb1.seek(docId)) {
- if (sb2.seek(docId)) {
- ++hits;
- sb1.unpack(docId);
- sb2.unpack(docId);
- ++docId;
- } else if (docId < sb2.getDocId())
- docId = sb2.getDocId();
- else
- ++docId;
- } else if (docId < sb1.getDocId())
- docId= sb1.getDocId();
- else
- ++docId;
- }
- uint64_t after = fastos::ClockSystem::now();
- *cycles = after - before;
- return hits;
-}
-
void
-testFakePair(FakePosting &f1, FakePosting &f2, unsigned int numDocs,
- bool unpack)
+testFakePair(const FakePosting &f1, const FakePosting &f2, uint32_t doc_id_limit, bool unpack)
{
- TermFieldMatchData md1;
- TermFieldMatchDataArray tfmda1;
- tfmda1.add(&md1);
- std::unique_ptr<SearchIterator> sb1(f1.createIterator(tfmda1));
-
- TermFieldMatchData md2;
- TermFieldMatchDataArray tfmda2;
- tfmda1.add(&md2);
- std::unique_ptr<SearchIterator> sb2(f2.createIterator(tfmda2));
-
- int hits = 0;
- uint64_t scanUnpackTime = 0;
- if (unpack) {
- hits = highLevelAndPairPostingScanUnpack(*sb1.get(), *sb2.get(),
- numDocs, &scanUnpackTime);
- } else {
- hits = highLevelAndPairPostingScan(*sb1.get(), *sb2.get(),
- numDocs, &scanUnpackTime);
- }
-#if 0
- printf("Fakepair %s AND %s => %d hits, %" PRIu64 " cycles\n",
- f1.getName().c_str(),
- f2.getName().c_str(),
- hits,
- scanUnpackTime);
-#else
- (void)hits;
-#endif
+ uint64_t scan_unpack_time = 0;
+ int hits = unpack ?
+ FakeMatchLoop::and_pair_posting_scan_with_unpack(f1, f2, doc_id_limit, scan_unpack_time) :
+ FakeMatchLoop::and_pair_posting_scan(f1, f2, doc_id_limit, scan_unpack_time);
+ (void) hits;
}
void
diff --git a/searchlib/src/tests/postinglistbm/postinglistbm.cpp b/searchlib/src/tests/postinglistbm/postinglistbm.cpp
index 7500f58cd9b..02fbe4878ba 100644
--- a/searchlib/src/tests/postinglistbm/postinglistbm.cpp
+++ b/searchlib/src/tests/postinglistbm/postinglistbm.cpp
@@ -5,6 +5,7 @@
#include <vespa/searchlib/common/bitvector.h>
#include <vespa/searchlib/common/resultset.h>
#include <vespa/searchlib/index/docidandfeatures.h>
+#include <vespa/searchlib/test/fakedata/fake_match_loop.h>
#include <vespa/searchlib/test/fakedata/fakeposting.h>
#include <vespa/searchlib/test/fakedata/fakeword.h>
#include <vespa/searchlib/test/fakedata/fakewordset.h>
@@ -123,136 +124,6 @@ validate_posting_for_word(const FakePosting& posting, const FakeWord& word, bool
}
}
-int
-highLevelSinglePostingScan(SearchIterator& iterator, uint32_t doc_id_limit, uint64_t& elapsed_time_ns)
-{
- uint32_t hits = 0;
- uint64_t before = fastos::ClockSystem::now();
- iterator.initFullRange();
- uint32_t doc_id = iterator.getDocId();
- while (doc_id < doc_id_limit) {
- if (iterator.seek(doc_id)) {
- ++hits;
- ++doc_id;
- } else if (doc_id < iterator.getDocId()) {
- doc_id = iterator.getDocId();
- } else {
- ++doc_id;
- }
- }
- uint64_t after = fastos::ClockSystem::now();
- elapsed_time_ns = after - before;
- return hits;
-}
-
-int
-highLevelSinglePostingScan(const FakePosting& posting, uint32_t doc_id_limit, uint64_t& elapsed_time_ns)
-{
- TermFieldMatchData md;
- TermFieldMatchDataArray tfmda;
- tfmda.add(&md);
- std::unique_ptr<SearchIterator> iterator(posting.createIterator(tfmda));
- return highLevelSinglePostingScan(*iterator, doc_id_limit, elapsed_time_ns);
-}
-
-int
-highLevelSinglePostingScanUnpack(SearchIterator& iterator, uint32_t doc_id_limit, uint64_t& elapsed_time_ns)
-{
- uint32_t hits = 0;
- uint64_t before = fastos::ClockSystem::now();
- iterator.initFullRange();
- uint32_t doc_id = iterator.getDocId();
- while (doc_id < doc_id_limit) {
- if (iterator.seek(doc_id)) {
- ++hits;
- iterator.unpack(doc_id);
- ++doc_id;
- } else if (doc_id < iterator.getDocId()) {
- doc_id = iterator.getDocId();
- } else {
- ++doc_id;
- }
- }
- uint64_t after = fastos::ClockSystem::now();
- elapsed_time_ns = after - before;
- return hits;
-}
-
-int
-highLevelSinglePostingScanUnpack(const FakePosting &posting, uint32_t doc_id_limit, uint64_t& elapsed_time_ns)
-{
- TermFieldMatchData md;
- TermFieldMatchDataArray tfmda;
- tfmda.add(&md);
- std::unique_ptr<SearchIterator> iterator(posting.createIterator(tfmda));
- return highLevelSinglePostingScanUnpack(*iterator, doc_id_limit, elapsed_time_ns);
-}
-
-int
-highLevelAndPairPostingScan(SearchIterator &sb1,
- SearchIterator &sb2,
- uint32_t numDocs, uint64_t *cycles)
-{
- uint32_t hits = 0;
- uint64_t before = fastos::ClockSystem::now();
- sb1.initFullRange();
- sb2.initFullRange();
- uint32_t docId = sb1.getDocId();
- while (docId < numDocs) {
- if (sb1.seek(docId)) {
- if (sb2.seek(docId)) {
- ++hits;
- ++docId;
- } else if (docId < sb2.getDocId()) {
- docId = sb2.getDocId();
- } else {
- ++docId;
- }
- } else if (docId < sb1.getDocId()) {
- docId = sb1.getDocId();
- } else {
- ++docId;
- }
- }
- uint64_t after = fastos::ClockSystem::now();
- *cycles = after - before;
- return hits;
-}
-
-int
-highLevelAndPairPostingScanUnpack(SearchIterator &sb1,
- SearchIterator &sb2,
- uint32_t numDocs,
- uint64_t *cycles)
-{
- uint32_t hits = 0;
- uint64_t before = fastos::ClockSystem::now();
- sb1.initFullRange();
- sb1.initFullRange();
- uint32_t docId = sb1.getDocId();
- while (docId < numDocs) {
- if (sb1.seek(docId)) {
- if (sb2.seek(docId)) {
- ++hits;
- sb1.unpack(docId);
- sb2.unpack(docId);
- ++docId;
- } else if (docId < sb2.getDocId()) {
- docId = sb2.getDocId();
- } else {
- ++docId;
- }
- } else if (docId < sb1.getDocId()) {
- docId = sb1.getDocId();
- } else {
- ++docId;
- }
- }
- uint64_t after = fastos::ClockSystem::now();
- *cycles = after - before;
- return hits;
-}
-
void
PostingListBM::testFake(const std::string &postingType,
const Schema &schema,
@@ -276,8 +147,8 @@ PostingListBM::testFake(const std::string &postingType,
uint64_t scanTime = 0;
uint64_t scanUnpackTime = 0;
- int hits1 = highLevelSinglePostingScan(*posting, word.getDocIdLimit(), scanTime);
- int hits2 = highLevelSinglePostingScanUnpack(*posting, word.getDocIdLimit(), scanUnpackTime);
+ int hits1 = FakeMatchLoop::single_posting_scan(*posting, word.getDocIdLimit(), scanTime);
+ int hits2 = FakeMatchLoop::single_posting_scan_with_unpack(*posting, word.getDocIdLimit(), scanUnpackTime);
printf("testFake '%s' hits1=%d, hits2=%d, scanTime=%" PRIu64
", scanUnpackTime=%" PRIu64 "\n",
@@ -299,25 +170,10 @@ testFakePair(const std::string &postingType,
FakePosting::SP f1(ff->make(fw1));
FakePosting::SP f2(ff->make(fw2));
- TermFieldMatchData md1;
- TermFieldMatchDataArray tfmda1;
- tfmda1.add(&md1);
- std::unique_ptr<SearchIterator> sb1(f1->createIterator(tfmda1));
-
- TermFieldMatchData md2;
- TermFieldMatchDataArray tfmda2;
- tfmda1.add(&md2);
- std::unique_ptr<SearchIterator> sb2(f2->createIterator(tfmda2));
-
- int hits = 0;
uint64_t scanUnpackTime = 0;
- if (unpack) {
- hits = highLevelAndPairPostingScanUnpack(*sb1.get(), *sb2.get(),
- fw1.getDocIdLimit(), &scanUnpackTime);
- } else {
- hits = highLevelAndPairPostingScan(*sb1.get(), *sb2.get(),
- fw1.getDocIdLimit(), &scanUnpackTime);
- }
+ int hits = unpack ?
+ FakeMatchLoop::and_pair_posting_scan_with_unpack(*f1, *f2, fw1.getDocIdLimit(), scanUnpackTime) :
+ FakeMatchLoop::and_pair_posting_scan(*f1, *f2, fw1.getDocIdLimit(), scanUnpackTime);
printf("Fakepair %s AND %s => %d hits, %" PRIu64 " cycles\n",
f1->getName().c_str(),
f2->getName().c_str(),