From 1de6a908edd2bc22be795042351f620cf4134037 Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Fri, 25 Oct 2024 10:04:36 +0200 Subject: [PATCH] Add speedtest for shuffle, plus a speedup in shuffle itself --- pdns/Makefile.am | 1 + pdns/shuffle.cc | 4 ++-- pdns/speedtest.cc | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/pdns/Makefile.am b/pdns/Makefile.am index 2522839a0f3c..2768e40b2220 100644 --- a/pdns/Makefile.am +++ b/pdns/Makefile.am @@ -964,6 +964,7 @@ speedtest_SOURCES = \ qtype.cc \ rcpgenerator.cc rcpgenerator.hh \ sillyrecords.cc \ + shuffle.cc shuffle.hh \ speedtest.cc \ statbag.cc \ svc-records.cc svc-records.hh \ diff --git a/pdns/shuffle.cc b/pdns/shuffle.cc index 1fbc004cf920..918533fc52e9 100644 --- a/pdns/shuffle.cc +++ b/pdns/shuffle.cc @@ -158,9 +158,9 @@ unsigned int pdns::dedup(vector& rrs) unsigned int numDups = 0; for (const auto& rec : rrs) { - const auto key = rec.getContent()->wireFormatContent(rec.d_name, true, true); + auto key = rec.getContent()->wireFormatContent(rec.d_name, true, true); // This ignores class, ttl and place by using constants for those - if (!seen.emplace(key).second) { + if (!seen.emplace(std::move(key)).second) { dups[counter] = true; numDups++; } diff --git a/pdns/speedtest.cc b/pdns/speedtest.cc index 976275c3a1a1..f59cd0cad6ed 100644 --- a/pdns/speedtest.cc +++ b/pdns/speedtest.cc @@ -14,6 +14,7 @@ #include "lock.hh" #include "dns_random.hh" #include "arguments.hh" +#include "shuffle.hh" #if defined(HAVE_LIBSODIUM) #include @@ -1181,6 +1182,37 @@ struct SipHashTest }; #endif +struct DedupRecordsTest +{ + explicit DedupRecordsTest(size_t howmany, bool dedup) : d_howmany(howmany), d_dedup(dedup) + { + } + + [[nodiscard]] string getName() const + { + return "DedupRecords " + std::to_string(d_howmany) + std::string(d_dedup ? "": " (generate only)"); + } + + void operator()() const + { + std::vector vec; + vec.reserve(d_howmany); + std::string name("some.name.in.some.domain"); + for (size_t i = 0; i < d_howmany; i++) { + auto content = DNSRecordContent::make(QType::TXT, QClass::IN, "\"a text " + std::to_string(i) + "\""); + DNSRecord rec(name, content, QType::TXT); + vec.emplace_back(std::move(rec)); + } + if (d_dedup) { + pdns::dedup(vec); + } + } + +private: + size_t d_howmany; + bool d_dedup; +}; + int main() { try { @@ -1335,6 +1367,12 @@ int main() #ifdef HAVE_LIBSODIUM doRun(SipHashTest("a string of chars")); #endif + doRun(DedupRecordsTest(2, false)); + doRun(DedupRecordsTest(2, true)); + doRun(DedupRecordsTest(256, false)); + doRun(DedupRecordsTest(256, true)); + doRun(DedupRecordsTest(4096, false)); + doRun(DedupRecordsTest(4096, true)); cerr<<"Total runs: " << g_totalRuns<