]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
speedtest: Add tests for LockGuarded
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 30 Apr 2021 13:43:25 +0000 (15:43 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 17 Aug 2021 12:04:45 +0000 (14:04 +0200)
pdns/speedtest.cc

index 4c4e76653e094a1430f567470acd4ba989b68893..34715eac4c76d184f3f1e7ba567c09f6b0da3fed 100644 (file)
@@ -37,7 +37,7 @@ template<typename C> 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<decltype(d_testlock)> 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<decltype(d_testlock)> 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<uint64_t> 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<string> parts;
@@ -161,8 +220,8 @@ struct VStringtokTest
   {
     return "vstringtok";
   }
-  
-  void operator()() const 
+
+  void operator()() const
   {
     string str("the quick brown fox jumped");
     vector<pair<unsigned int, unsigned> > 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<uint8_t>& packet, const std::string& name) 
+  explicit ParsePacketTest(const vector<uint8_t>& 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<pair<DNSName, QType>, set<DNSResourceRecord>, TCacheComp > tcache_t;
     tcache_t tcache;
-    
+
     struct {
             vector<DNSResourceRecord> 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<uint8_t>& packet, const std::string& name) 
+  explicit ParsePacketBareTest(const vector<uint8_t>& 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<decltype(d_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: "<<e.what()<<endl;
 }
-