From 083d84cfd6330be0bcaaaf5e21843a2369b3c1bc Mon Sep 17 00:00:00 2001 From: Justin Viiret Date: Fri, 7 Apr 2017 17:02:00 +1000 Subject: [PATCH] expressions: add much faster limitToSignatures() --- tools/hsbench/main.cpp | 5 ++--- util/expressions.cpp | 26 +++++++++++++------------- util/expressions.h | 17 +++++++---------- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/tools/hsbench/main.cpp b/tools/hsbench/main.cpp index a37d4839..9eadf6dd 100644 --- a/tools/hsbench/main.cpp +++ b/tools/hsbench/main.cpp @@ -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; } diff --git a/util/expressions.cpp b/util/expressions.cpp index 944c7477..93062b48 100644 --- a/util/expressions.cpp +++ b/util/expressions.cpp @@ -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: @@ -27,6 +27,10 @@ */ #include "config.h" +#include "expressions.h" + +#include "hs.h" +#include "string_util.h" #include #include @@ -34,7 +38,6 @@ #include #include -#include #include #include #if !defined(_WIN32) @@ -45,9 +48,7 @@ #include #endif -#include "expressions.h" -#include "hs.h" -#include "string_util.h" +#include 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; } diff --git a/util/expressions.h b/util/expressions.h index 949c9201..03d59e15 100644 --- a/util/expressions.h +++ b/util/expressions.h @@ -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: @@ -31,10 +31,10 @@ #include #include -#include +#include -typedef std::map ExpressionMap; -typedef std::list SignatureSet; +using ExpressionMap = std::map; +using SignatureSet = std::vector; // 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