]> git.ipfire.org Git - thirdparty/vectorscan.git/commitdiff
expressions: add much faster limitToSignatures()
authorJustin Viiret <justin.viiret@intel.com>
Fri, 7 Apr 2017 07:02:00 +0000 (17:02 +1000)
committerMatthew Barr <matthew.barr@intel.com>
Tue, 30 May 2017 03:49:24 +0000 (13:49 +1000)
tools/hsbench/main.cpp
util/expressions.cpp
util/expressions.h

index a37d48394652b98f23b29058a630fb3843c3a046..9eadf6dd78889da0ecb60d5623b46921fa985d06 100644 (file)
@@ -756,6 +756,7 @@ int main(int argc, char *argv[]) {
     // known expressions together.
     if (sigSets.empty()) {
         SignatureSet sigs;
+        sigs.reserve(exprMapTemplate.size());
         for (auto i : exprMapTemplate | map_keys) {
             sigs.push_back(i);
         }
@@ -772,9 +773,7 @@ int main(int argc, char *argv[]) {
     }
 
     for (const auto &s : sigSets) {
-        ExpressionMap exprMap = exprMapTemplate; // copy
-
-        limitBySignature(exprMap, s.sigs);
+        auto exprMap = limitToSignatures(exprMapTemplate, s.sigs);
         if (exprMap.empty()) {
             continue;
         }
index 944c74772ac9f77fbb62153388e173f0d93ec99a..93062b48851ff23f5ceae8d8bc42527ef92f96d7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Intel Corporation
+ * Copyright (c) 2015-2017, Intel Corporation
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
  */
 
 #include "config.h"
+#include "expressions.h"
+
+#include "hs.h"
+#include "string_util.h"
 
 #include <algorithm>
 #include <fstream>
@@ -34,7 +38,6 @@
 #include <stdexcept>
 #include <string>
 
-#include <boost/algorithm/string/trim.hpp>
 #include <sys/types.h>
 #include <sys/stat.h>
 #if !defined(_WIN32)
@@ -45,9 +48,7 @@
 #include <windows.h>
 #endif
 
-#include "expressions.h"
-#include "hs.h"
-#include "string_util.h"
+#include <boost/algorithm/string/trim.hpp>
 
 using namespace std;
 
@@ -90,7 +91,7 @@ void processLine(string &line, unsigned lineNum,
 
     //cout << "Inserting expr: id=" << id << ", pcre=" << pcre_str << endl;
 
-    bool ins = exprMap.insert(ExpressionMap::value_type(id, pcre_str)).second;
+    bool ins = exprMap.emplace(id, pcre_str).second;
     if (!ins) {
         failLine(lineNum, file, line, "Duplicate ID found.");
     }
@@ -278,20 +279,19 @@ void loadSignatureList(const string &inFile,
     }
 }
 
-void limitBySignature(ExpressionMap &exprMap,
-                      const SignatureSet &signatures) {
+ExpressionMap limitToSignatures(const ExpressionMap &exprMap,
+                                const SignatureSet &signatures) {
     ExpressionMap keepers;
 
-    SignatureSet::const_iterator it, ite;
-    for (it = signatures.begin(), ite = signatures.end(); it != ite; ++it) {
-        ExpressionMap::const_iterator match = exprMap.find(*it);
+    for (auto id : signatures) {
+        auto match = exprMap.find(id);
         if (match == exprMap.end()) {
-            cerr << "Unable to find signature " << *it
+            cerr << "Unable to find signature " << id
                     << " in expression set!" << endl;
             exit(1);
         }
         keepers.insert(*match);
     }
 
-    exprMap.swap(keepers);
+    return keepers;
 }
index 949c9201f1d0708d1411d95a418829f84c343641..03d59e1541315f38a1ebf01879d212a0df1df871 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Intel Corporation
+ * Copyright (c) 2015-2017, Intel Corporation
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
 
 #include <map>
 #include <string>
-#include <list>
+#include <vector>
 
-typedef std::map<unsigned, std::string> ExpressionMap;
-typedef std::list<unsigned> SignatureSet;
+using ExpressionMap = std::map<unsigned, std::string>;
+using SignatureSet = std::vector<unsigned>;
 
 // load all of the expressions from the given directory into the given
 // expression map. Exits on failure.
@@ -45,11 +45,8 @@ void loadExpressionsFromFile(const std::string &fname, ExpressionMap &exprMap);
 // load a list of signature IDs
 void loadSignatureList(const std::string &inFile, SignatureSet &signatures);
 
-// produce a new expression map only containing those signatures in the
-// expression list
-void generateExprMap(const SignatureSet &signatures,
-    const ExpressionMap &allExprs, ExpressionMap &out);
+// trim expression map to only the given signatures, returning result
+ExpressionMap limitToSignatures(const ExpressionMap &exprMap,
+                                const SignatureSet &signatures);
 
-// trim expression map to only the given signatures (in-place)
-void limitBySignature(ExpressionMap &exprMap, const SignatureSet &signatures);
 #endif