Boost xpressive



  • Hallo!

    Stehe vor einem Problem:

    Derzeit habe ich ~700 (recht einfache) reguläre Ausdrücke - Tendenz wachsend. Diese müssen mit einem Text gematcht werden, der in der Regel ~100 Treffer enthält.

    Ohne mich bisher tiefer mit xpressive beschäftigt zu haben, meine Frage: Ist es sinnvoll und möglich Boost::xpressive zur Beschleunigung des Parsens zu verwenden?

    Derzeit dauert der Vorgang etwa 10 Sekunden, was viel zu lange ist.

    Danke!



  • Womit machst du es denn jetzt? mit std::regex?



  • Multithreading ...



  • TNA schrieb:

    Womit machst du es denn jetzt? mit std::regex?

    Ja. Probiere es aber auch noch mit boost::regex, vielleicht gibts einen kleinen Unterschied.



  • knivil schrieb:

    Multithreading ...

    Wäre eine gute Möglichkeit, ja!

    Aber mir geht es erstmal nur darum, eine optimale Implementierung von Regex zu bekommen, daher meine Frage nach boost::xpressive, ob das überhaupt anwendbar ist, wenn das Programm zur Laufzeit mit den regulären Ausdrücken (via Ini-File) gefüttert wird.



  • Wenn insbesondere die Matchggeschwindigkeit entscheidend ist, setze doch mal das optimize Flag und teste dann. Prinzipiell hängt es sicherlich davon ab, wie gut die von dir verwendete C++ Library ist.



  • Tomahawk schrieb:

    knivil schrieb:

    Multithreading ...

    Aber mir geht es erstmal nur darum, eine optimale Implementierung von Regex zu bekommen, daher meine Frage nach boost::xpressive, ob das überhaupt anwendbar ist, wenn das Programm zur Laufzeit mit den regulären Ausdrücken (via Ini-File) gefüttert wird.

    Ich kenne mich mit boost::xpressive nicht wirklich aus und habe da nur mal drübergeschaut. Damit kann man wohl auch dynamische regulären Ausdrücken erstellen. Ob das schneller ist als deine stl::regex Implementierung wirst du wohl ausprobieren müssen.



  • Sehr auffällig, dass boost::regex in Win32 deutlich schneller zu sein scheint als std::regex?



  • Tomahawk schrieb:

    Sehr auffällig, dass boost::regex in Win32 deutlich schneller zu sein scheint als std::regex?

    Welcher Compiler bzw. welche C++ Library?



  • TNA schrieb:

    Tomahawk schrieb:

    Sehr auffällig, dass boost::regex in Win32 deutlich schneller zu sein scheint als std::regex?

    Welcher Compiler bzw. welche C++ Library?

    Visual Studio 2012, Win32 Release. Boost 1.53.0 32-Bit.

    // "pattern" ist ein vector<string> mit etwa 700 regulären Ausdrücken
    // "lines" ist ein vector<string> mit etwa 40KB an Text
    
    // STD Implementierung
    for (auto &p : pattern) {
      std::regex expression(p);
      for (auto &line : lines) {
        if (std::regex_search(line, expression)) {
          std::cout << "match\n";
        }
      }
    }
    
    // BOOST Implementierung
    for (auto &p : pattern) {
      boost::regex expression(p);
      for (auto &line : lines) {
        if (boost::regex_search(line, expression)) {
          std::cout << "match\n";
        }
      }
    }
    

    Die BOOST Implementierung ist bei mir etwa um Faktor 8 schneller als die STD Implementierung?



  • Tomahawk schrieb:

    Die BOOST Implementierung ist bei mir etwa um Faktor 8 schneller als die STD Implementierung?

    Wenn du das wirklich gemessen hast, wird es wohl stimmen. Durchaus möglich, dass die Boost Implementierung schneller ist als die von Mirosoft.

    Was mich noch interessieren würde, Wie sieht es so aus?

    for (auto &p : pattern) {
      std::regex expression(p,std::regex::optimize);
      for (auto &line : lines) {
        if (std::regex_search(line, expression)) {
          std::cout << "match\n";
        }
      }
    }
    


  • TNA schrieb:

    Tomahawk schrieb:

    Die BOOST Implementierung ist bei mir etwa um Faktor 8 schneller als die STD Implementierung?

    Wenn du das wirklich gemessen hast, wird es wohl stimmen. Durchaus möglich, dass die Boost Implementierung schneller ist als die von Mirosoft.

    Was mich noch interessieren würde, Wie sieht es so aus?

    for (auto &p : pattern) {
      std::regex expression(p,std::regex::optimize);
      for (auto &line : lines) {
        if (std::regex_search(line, expression)) {
          std::cout << "match\n";
        }
      }
    }
    

    Hier meine Ergebnisse:

    std::regex: 4050ms
    std::regex mit std::regex::optimise: 4040ms
    boost::regex: 310ms
    boost::regex mit boost::regex::optimise: 300ms

    Der Unterschied ist enorm. Habe meine Boost Libraries mit MSVC11 compiliert.



  • Das Performance-Problem mit der Regex Implementierung von Microsoft war wohl schon bekannt:

    http://connect.microsoft.com/VisualStudio/feedback/details/528088/std-tr1-regex-match-very-slow-to-evaluate-for-some-cases


Anmelden zum Antworten