Warum werden reguläre Ausdrücke in C # schneller kompiliert als entsprechende Zeichenfolgemethoden?

Jedes Mal, wenn ich einfache Eingrenzungs- oder Ersetzungsoperationen für Zeichenfolgen ausführen muss, bei denen der gesuchte Begriff ein fester Wert ist, stelle ich fest, dass ein kompilierter regulärer Ausdruck verwendet wird, wenn ich meine Beispieleingabe nehme und ein Profil daraus erstellt Fast immer schneller als mit der entsprechenden Methode der String-Klasse.

Ich habe versucht, eine Vielzahl von Methoden zu vergleichen (hs ist der "Heuhaufen" zu suchen,ndl ist die "Nadel" zu suchen,repl ist der Wiederbeschaffungswert.regex wird immer mit dem erstelltRegexOptions.Compiled Möglichkeit ):

hs.Replace( ndl, repl ) vsregex.Replace( hs, repl )hs.Contains( ndl ) vsregex.IsMatch( hs )

Ich habe einige Diskussionen gefunden, die sich auf Folgendes konzentrierenwelche der beiden Techniken sind schneller (1, 2, 3und viele andere), aber diese Diskussionen scheinen sich immer auf Folgendes zu konzentrieren:

Verwenden Sie die String-Version für einfache Operationen und reguläre Ausdrücke für komplexe Operationen (was aus der Performance-Perspektive nicht unbedingt eine gute Idee zu sein scheint), oderFühren Sie einen Test durch und vergleichen Sie die beiden (und für äquivalente Tests scheint die Regex-Version immer eine bessere Leistung zu erbringen).

Ich verstehe nicht, wie dies möglicherweise der Fall sein kann: Wie vergleicht die Regex-Engine zwei beliebige Zeichenfolgen für Teilzeichenfolgen-Übereinstimmungen schneller als die entsprechende Zeichenfolgenversion? Dies scheint für sehr kleine oder sehr große Suchbereiche zu gelten, oder für Suchbegriffe, die klein oder groß sind, oder ob der Suchbegriff früh oder spät im Suchbereich vorkommt.

So,Warum sind reguläre Ausdrücke schneller?

* In der Tat, dienur Ich habe es geschafft zu zeigen, dass die String-Version schneller ist als ein kompilierter regulärer Ausdruck, wenn ich einen leeren String suche! In allen anderen Fällen, von einzelnen Zeichenfolgen bis hin zu sehr langen Zeichenfolgen, wird eine kompilierte Regex schneller verarbeitet als die entsprechende Zeichenfolgenmethode.

Aktualisieren: Es wurde eine Klausel hinzugefügt, um zu verdeutlichen, dass ich Fälle betrachte, in denen der Suchbegriff zur Kompilierungszeit bekannt ist. Bei dynamischen oder einmaligen Operationen führt der Mehraufwand beim Kompilieren des regulären Ausdrucks tendenziell zu einer Verschiebung der Ergebnisse zugunsten der Zeichenfolgemethoden.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage