From: Remi Gacogne Date: Fri, 30 Apr 2021 13:43:25 +0000 (+0200) Subject: speedtest: Add tests for LockGuarded X-Git-Tag: dnsdist-1.7.0-alpha1~62^2~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b5ee1f25a34d89ff1dc014385347a19028e8d12d;p=thirdparty%2Fpdns.git speedtest: Add tests for LockGuarded --- diff --git a/pdns/speedtest.cc b/pdns/speedtest.cc index 4c4e76653e..34715eac4c 100644 --- a/pdns/speedtest.cc +++ b/pdns/speedtest.cc @@ -37,7 +37,7 @@ template void doRun(const C& cmd, int mseconds=100) signal(SIGVTALRM, alarmHandler); setitimer(ITIMER_VIRTUAL, &it, 0); - + unsigned int runs=0; g_stop=false; CPUTime dt; @@ -88,7 +88,7 @@ struct MakeStringFromCharStarTest { string name("outpost.ds9a.nl"); d_size += name.length(); - + } mutable int d_size; }; @@ -108,22 +108,81 @@ struct GetTimeTest } }; -std::mutex s_testlock; - struct GetLockUncontendedTest { string getName() const { - return "getlock-uncontended-test"; + return "get-lock-uncontended-test"; } void operator()() const { - s_testlock.lock(); - s_testlock.unlock(); + for (size_t idx = 0; idx < 1000; idx++) { + d_testlock.lock(); + ++d_value; + d_testlock.unlock(); + } } +private: + mutable std::mutex d_testlock; + mutable uint64_t d_value{0}; }; +struct GetUniqueLockUncontendedTest +{ + string getName() const + { + return "get-unique-lock-uncontended-test"; + } + + void operator()() const + { + for (size_t idx = 0; idx < 1000; idx++) { + std::unique_lock lock(d_testlock); + ++d_value; + } + } +private: + mutable std::mutex d_testlock; + mutable uint64_t d_value{0}; +}; + +struct GetLockGuardUncontendedTest +{ + string getName() const + { + return "get-lock-guard-uncontended-test"; + } + + void operator()() const + { + for (size_t idx = 0; idx < 1000; idx++) { + std::lock_guard lock(d_testlock); + ++d_value; + } + } +private: + mutable std::mutex d_testlock; + mutable uint64_t d_value{0}; +}; + +struct GetLockGuardedUncontendedTest +{ + string getName() const + { + return "get-lock-guarded-uncontended-test"; + } + + void operator()() const + { + for (size_t idx = 0; idx < 1000; idx++) { + ++*(d_value.lock()); + } + } + +private: + mutable LockGuarded d_value{0}; +}; struct StaticMemberTest { @@ -146,8 +205,8 @@ struct StringtokTest { return "stringtok"; } - - void operator()() const + + void operator()() const { string str("the quick brown fox jumped"); vector parts; @@ -161,8 +220,8 @@ struct VStringtokTest { return "vstringtok"; } - - void operator()() const + + void operator()() const { string str("the quick brown fox jumped"); vector > parts; @@ -176,14 +235,14 @@ struct StringAppendTest { return "stringappend"; } - - void operator()() const + + void operator()() const { string str; static char i; for(int n=0; n < 1000; ++n) str.append(1, i); - i++; + i++; } }; @@ -194,14 +253,14 @@ struct BoostStringAppendTest { return "booststringappend"; } - - void operator()() const + + void operator()() const { boost::container::string str; static char i; for(int n=0; n < 1000; ++n) str.append(1, i); - i++; + i++; } }; @@ -374,12 +433,12 @@ struct TXTRecordTest struct GenericRecordTest { - explicit GenericRecordTest(int records, uint16_t type, const std::string& content) + explicit GenericRecordTest(int records, uint16_t type, const std::string& content) : d_records(records), d_type(type), d_content(content) {} string getName() const { - return (boost::format("%d %s records") % d_records % + return (boost::format("%d %s records") % d_records % DNSRecordContent::NumberToType(d_type)).str(); } @@ -581,7 +640,7 @@ struct timeval d_now; struct ParsePacketTest { - explicit ParsePacketTest(const vector& packet, const std::string& name) + explicit ParsePacketTest(const vector& packet, const std::string& name) : d_packet(packet), d_name(name) {} @@ -595,17 +654,17 @@ struct ParsePacketTest MOADNSParser mdp(false, (const char*)&*d_packet.begin(), d_packet.size()); typedef map, set, TCacheComp > tcache_t; tcache_t tcache; - + struct { vector d_result; bool d_aabit; int d_rcode; } lwr; - for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) { + for(MOADNSParser::answers_t::const_iterator i=mdp.d_answers.begin(); i!=mdp.d_answers.end(); ++i) { DNSResourceRecord rr; rr.qtype=i->first.d_type; rr.qname=i->first.d_name; - + rr.ttl=i->first.d_ttl; rr.content=i->first.d_content->getZoneRepresentation(); // this should be the serialised form lwr.d_result.push_back(rr); @@ -619,7 +678,7 @@ struct ParsePacketTest struct ParsePacketBareTest { - explicit ParsePacketBareTest(const vector& packet, const std::string& name) + explicit ParsePacketBareTest(const vector& packet, const std::string& name) : d_packet(packet), d_name(name) {} @@ -639,7 +698,7 @@ struct ParsePacketBareTest struct SimpleCompressTest { - explicit SimpleCompressTest(const std::string& name) + explicit SimpleCompressTest(const std::string& name) : d_name(name) {} @@ -863,6 +922,22 @@ struct NSEC3HashTest DNSName d_name = DNSName("www.example.com"); }; +struct SharedLockTest +{ + string getName() const { return "Shared lock"; } + + void operator()() const { + for (size_t idx = 0; idx < 1000; idx++) { + std::shared_lock lock(d_lock); + ++d_value; + } + } + +private: + mutable std::shared_mutex d_lock; + mutable uint64_t d_value; +}; + struct ReadWriteLockSharedTest { explicit ReadWriteLockSharedTest(ReadWriteLock& lock): d_lock(lock) @@ -984,12 +1059,17 @@ try doRun(SimpleCompressTest("www.france.ds9a.nl")); - + doRun(VectorExpandTest()); doRun(GetTimeTest()); - + doRun(GetLockUncontendedTest()); + doRun(GetUniqueLockUncontendedTest()); + doRun(GetLockGuardUncontendedTest()); + doRun(GetLockGuardedUncontendedTest()); + doRun(SharedLockTest()); + { ReadWriteLock rwlock; doRun(ReadWriteLockSharedTest(rwlock)); @@ -1007,7 +1087,7 @@ try } doRun(StaticMemberTest()); - + doRun(ARecordTest(1)); doRun(ARecordTest(2)); doRun(ARecordTest(4)); @@ -1043,9 +1123,9 @@ try doRun(SOARecordTest(64)); doRun(StringtokTest()); - doRun(VStringtokTest()); - doRun(StringAppendTest()); - doRun(BoostStringAppendTest()); + doRun(VStringtokTest()); + doRun(StringAppendTest()); + doRun(BoostStringAppendTest()); doRun(DNSNameParseTest()); doRun(DNSNameRootTest()); @@ -1083,4 +1163,3 @@ catch(std::exception &e) { cerr<<"Fatal: "<