speed up dedup code, use less memory
authorbert hubert <bert.hubert@netherlabs.nl>
Wed, 13 Jun 2018 08:47:50 +0000 (10:47 +0200)
committerbert hubert <bert.hubert@netherlabs.nl>
Wed, 13 Jun 2018 08:47:50 +0000 (10:47 +0200)
pdns/dnspacket.cc
pdns/dnspacket.hh

index af6af8ea66309490ce227a82ce91c51a82f38628..c3e3b35bf586fb5277620c0942d05a490cbc770d 100644 (file)
@@ -186,13 +186,14 @@ void DNSPacket::addRecord(const DNSZoneRecord &rr)
 
   if(d_compress) {
     std::string ser = const_cast<DNSZoneRecord&>(rr).dr.d_content->serialize(rr.dr.d_name);
-    if(d_dedup.count({rr.dr.d_name, ser})) { // might be a dup
+    auto hash = boost::hash< std::pair<DNSName, std::string> >()({rr.dr.d_name, ser});
+    if(d_dedup.count(hash)) { // might be a dup
       for(auto i=d_rrs.begin();i!=d_rrs.end();++i) {
         if(rr.dr == i->dr)  // XXX SUPER SLOW
           return;
       }
     }
-    d_dedup.insert({rr.dr.d_name, ser});
+    d_dedup.insert(hash);
   }
 
   d_rrs.push_back(rr);
index 3264855e4e9f9fa524eaa24dda1f63729afe821e..9d421e3560bed4170bb95b0ee79897c36d37a137 100644 (file)
@@ -175,7 +175,7 @@ private:
   string d_tsigprevious;
 
   vector<DNSZoneRecord> d_rrs; // 8
-  std::unordered_set<pair<DNSName, std::string>, boost::hash< std::pair<DNSName, std::string> >  > d_dedup;
+  std::unordered_set<size_t> d_dedup;
   string d_rawpacket; // this is where everything lives 8
   EDNSSubnetOpts d_eso;