2010-04-05 14 views
6

in einer Scripting-Engine zu schreiben, habe ich Funktionen wie (Pseudocode)Regex gegen manuellen Vergleich. Welche ist schneller?

function is_whitespace?(char c){ 
    return c==' ' || c=='\t' || c=='\r' || c=='\n'; 
} 

Nun, meine Frage ist, was in den meisten langugaes schneller ist? Das oder mit regex wie

function is_whitespace?(char c){ 
    return regex_match('\s',c); 
} 

Die Hauptsprachen ich bin besorgt sind C#, C und Ruby auch falls es vollständig plattformabhängig ist.

+2

Scheint einfach genug, um einen schnellen Test zu machen, um es herauszufinden. Erzeugen Sie eine Datei voller zufälliger Zeichen und übergeben Sie sie durch beide Funktionen. –

+0

Ich denke du meintest '\ s' statt '\ w' dort. – sepp2k

+0

ja, das ist wahr .. Mono muss für den C# -Test aber reichen .. – Earlz

Antwort

11

Natürlich sind vier Vergleiche kleiner Speicherbereiche viel schneller (und verwenden fast keinen Speicher) als das Erstellen, Ausführen und Zerstören eines Zustandsautomaten.

+0

+1. Beachten Sie, dass kompliziertere Beispiele die Regex möglicherweise schneller verwenden. –

+0

Nun, wann schlägt Regex (naive) manuelle Vergleiche? – Earlz

+3

Meine Vermutung ist nie, aber ein Matcher für eine reguläre Sprache von Hand zu codieren könnte sehr kompliziert werden im Vergleich zum Schreiben einer Regex. – danben

1

In den meisten Fällen ist die Regex, um etwas wie ein Leerzeichen zu finden, sehr schnell. Sie haben viele Blicke auf die Leistung in den führenden Regex-Implementierungen und es gibt wahrscheinlich andere Bereiche von "tief hängenden Früchten" zur Optimierung in anderen Bereichen Ihres Codes.

Die Bereiche schlechter Leistung einer Regex ist eine schlecht geschriebene Regex. Tipps sind, so viel unnötiges Zurückverfolgen, Gruppieren und Ändern wie möglich zu vermeiden. Verwenden Sie so etwas wie "Regex Buddy" oder Perl mit "re-debug verwenden", um zu sehen, wie viele Zweige Ihre Regex braucht.

Die Links sind zu einigen Regex-Leistungsproblemen.

Im Zweifelsfall tut Vergleich Timings ...

Coding Horor- Regex

Java Performance - Regex

3

Der manuelle Vergleich ist schneller auszuführen, ist der regex Vergleich schneller tippen.

Beachten Sie, dass Ihre beiden Implementierungen nicht gleichwertig sind, wenn Ihr System Unicode verwendet. Die Regex \s stimmt mit allen Unicode-Leerzeichen überein, während Ihr manueller Vergleich nur das grundlegende ASCII behandelt und nicht einmal die vertikalen Tabulatoren und die Zeichen für die Formularzuführung enthält, die normalerweise auch als Leerzeichen betrachtet werden.

Wenn Sie dies in einer Hochsprache schreiben, würde ich vorschlagen, die is_whitespace() - Funktion zu verwenden, die bereits von den Bibliotheken Ihrer Programmiersprache bereitgestellt wird. Eine grundlegende Funktion wie diese ist fast immer enthalten.

Also am Ende ist die Antwort "es kommt darauf an". In einigen Situationen ist der zusätzliche Programmieraufwand bei der Verwendung von Verfahrenscode gerechtfertigt. In vielen Fällen ist die Regex schnell genug und einfacher zu warten.

+0

Kommt es nicht darauf an, ob Ihre Regex-Implementierung Unicode-fähig ist? (und Ihre Sprache. Zum Beispiel glaube ich, Ruby ist immer noch nicht Unicode-bewusst) – Earlz

+0

Ich sagte: "Wenn Ihr System Unicode verwendet". Damit meinte ich sowohl die Programmiersprache als auch den Regex-Geschmack. Die Regex-Variante in Ruby 1.8 unterstützt nicht Unicode, die in Ruby 1.9. –

1

Nach der Plattennutzung sind Regexes fast immer mein Leistungsengpass, wenn ich meinen Code profiliere. selbst für einfache Dinge wie .split ("").

0

Ich kann nicht über C# oder C sprechen, aber ich würde nicht annehmen, dass die Nicht-Regex-Form in Ruby schneller ist.

Verwandte Themen