2009-11-18 14 views
13

Ich bin auf der Suche nach einem Leistungsvergleich zwischen Perl und Boost regulären Ausdruck.
Ich brauche ein Stück Code zu entwerfen, die auf regulären Ausdrücken sehr stark angewiesen ist, und kann wählen zwischen:Reguläre Ausdrücke Leistung: Boost vs Perl

  1. es durch einen Schub regex
  2. Dispatching ein Perl-Interpreter und die Arbeit in Perl
  3. läuft

Ich weiß, Perl ist für seine optimierte String-Verarbeitung bekannt. Ich kann jedoch keinen Leistungsvergleich finden, um die Regex-Bibliothek zu verbessern.
Kennen Sie einen solchen Vergleich?
Danke

+2

Wenn Sie nach regulären Perl-Ausdrücken fragen, fragen Sie nach dem Perl-Interpreter selbst oder PCRE (Perl-kompatible reguläre Ausdrücke)? –

+0

PCRE wird wahrscheinlich sehr gut für dich sein. Wenn Sie jedoch _really_ benötigen, können Sie auch eine Verbindung zu Perl selbst herstellen und Zugriff auf die Regex-Interna erhalten. Keine Garantie für die Benutzerfreundlichkeit der API. –

+1

Versuchen Sie beides. Die besondere Art von regulären Ausdrücken, die Sie brauchen und Daten werden viel Unterschied machen. – igouy

Antwort

12

Die Startkosten ein Perl-Interpreter laufen aus Ihrer Anwendung heraus (über die Systemfunktion, die ich vermute) überwiegen alle Vorteile, die Sie gegenüber Perls Regex-Engine haben. Die Ausnahme wäre, wenn Sie einen sehr komplizierten regulären Ausdruck haben, für den die Regex-Implementierung von Perl optimiert ist, aber die Regex-Engine von Boost nicht.

Die wirkliche Antwort ist, dass ich keinen solchen Vergleich kenne, aber Perls Einrichtungen für reguläre Ausdrücke sind nicht unbedingt die schnellsten. Ein paar Informationen zu einem Algorithmus, der den regulären Ausdruck von Perl für einige Ausdrücke übertrifft, finden Sie unter here.

EDIT: Es ist möglich, die Startkosten für den Start eines vollständigen Perl-Interpreters durch Verknüpfung zu Lipperl oder libPCRE zu überwinden. Und mit Boost erhalten Sie wahrscheinlich mehr Flexibilität und Performance-Tuning-Optionen, wenn Sie sie brauchen.

Schlussbemerkung: Es sind keine direkten Vergleiche zwischen boost.regex und Perls Regex in Bezug auf die Leistung bekannt. Die Lösung besteht darin, beides zu versuchen und zu sehen, welche für die spezifische Situation des OP leistungsfähiger ist.

(Edit:. Es gibt jetzt einen guten Vergleich zwischen Boost und PCRE Siehe http://www.boost.org/doc/libs/1_41_0/libs/regex/doc/gcc-performance.html)

+1

Sie können auch zu libperl verknüpfen und Perls reguläre Ausdrücke ohne die verwenden Overhead des vollständigen Perl-Interpreters.Die API ist möglicherweise nicht dafür ausgelegt, aber es ist sicherlich möglich. –

+0

Es gibt auch libPCRE: http://www.pcre.org/ – greyfade

+1

Technisch hat PCRE einige geringfügige Unterschiede zu Perls Regexes, aber sie sind Randfälle. Ich würde wetten, dass Perls Regexes etwas schneller sind, aber ich bezweifle, dass es wichtig ist. –

8

Wenn Sie es noch nicht gesehen haben, gibt es eine regexp benchmark in the Great Language Shootout. Es ist Perl nicht sehr hoch. Eine Boost-Implementierung, die boost::xpressive verwendet, steht an erster Stelle (was den Ausdruck zum Kompilierungszeitpunkt vorkompiliert). Dies ist jedoch ein Mikrobenzeichen, also wahrscheinlich nicht repräsentativ für die allgemeine reguläre Ausdruckgeschwindigkeit, aber dennoch einen Blick wert.

Erstaunlicherweise scheint die schnellste Engine für reguläre Ausdrücke bei weitem Google Chrome V8 JavaScript JIT (fast GCC schlägt in wanduhr Zeit, nur einen einzigen CPU-Kern verwendet)

+3

Ich bezweifle ernsthaft, dass Regex Benchmark genau ist. Ich habe noch nie gesehen, dass Pythons Regex-Engine die von Perl übertrifft. –

+1

Jemand hat jetzt einen Boost-Benchmark beigesteuert, und er liegt an erster Stelle. Hat heute jemand dazu beigetragen? –

+2

Außerdem gibt es im Abschnitt "Interessante Alternativen" zwei Perl-Versionen, die schneller sind als alles andere. –

0

Die Perl-Interpreter ein fest Kosten sein werden. Wenn die Zeit, die durch das Ausführen Ihrer Daten durch den Interpreter eingespart wird, die Kosten des Interpreters (dh Sie haben eine Menge Daten) stark überwiegt, haben Sie eine Leistungssteigerung.

Es ist wahrscheinlich, dass Sie hier mit reinem C++ arbeiten, nur wegen des Prozessaufrufs.

Entschuldigung, ich habe keine Daten. Ich mag es aber, deine Testergebnisse zu sehen.

2

Es sei denn, Ihre Regex ist wahnsinnig komplex (für die Perl-Regex-Engine ist übrigens unglaublich schnell), dann, wie andere gesagt haben, ist Ihr Overhead im Interpreter-Startup. Auf der anderen Seite könnten Sie eine persistente Perl, die einen Regex-Server bietet leicht ausführen.

6

Wenn Ihre regulären Ausdrücke zur Kompilierzeit festgelegt werden, können Sie auch Boost.XPressive in Betracht ziehen. Es ermöglicht es, Regexes als Ausdrucksvorlagen zu schreiben, die zur Kompilierungszeit analysiert werden.

3

Beginnen Sie mit der einfachsten Lösung. Entscheiden Sie, wie schnell es für Ihre Anwendung sein muss. Dann messen Sie die Geschwindigkeit. Wenn es zu langsam ist, versuchen Sie die härtere Lösung. Messen Sie erneut. Wiederholen Sie dies bei Bedarf.

Während mein Bauchgefühl mit den meisten anderen Antworten übereinstimmt, die sagen, dass das Starten des Dolmetschers teurer sein wird, werden Sie es nie erfahren, bis Sie es gemessen haben.

Es ist "schnellstmöglich" und "schnell genug für Ihre Anwendung". Fügen Sie keine Komplexität hinzu, um die erste zu erhalten, wenn Sie diese bereits haben.

+0

PCRE-JIT ist das schnellste da draußen, aber es fehlt Textoptimierung (perl's study() -Funktion), und das kann für einige Anwendungen eine große Auswirkung haben. –

1

Wenn Sie wirklich schnell brauchen, können Sie einen REGEX Inhalt Koprozessor bekommen. Es gibt zwei, von denen ich weiß. Titanic macht eine Reihe von Prozessoren. Ein anderer wird von Cavium gemacht. Und schließlich hat LSI eine kleinere Firma gekauft und liefert eine Linie von regular expression matching processors.

Diese Systeme können Tausende von regulären Ausdrücken parallel und nicht einzeln nacheinander ausführen. Der teuerste Teil der Verwendung von ihnen ist das Verschieben von Speicher zu ihnen und Verschieben von ihnen zurück und Umgang mit Block-Grenzen, etc.

Aber wenn Leistung ein Anliegen ist, möchten Sie vielleicht diese ausprobieren.

+0

A lil mehr als ich brauche, aber wirklich interessant! Vielen Dank! –