Wie kann ich diesen Regex-Ersatz übertreffen?

7

Nach erheblicher Messung habe ich einen Hotspot in einem unserer Windows-Dienste identifiziert, den ich optimieren möchte. Wir verarbeiten Strings, die mehrere aufeinanderfolgende Leerzeichen enthalten können, und wir möchten nur auf einzelne Leerzeichen reduzieren. Wir verwenden eine statische kompilierte Regex für diese Aufgabe:

%Vor%

und verwenden Sie es dann wie folgt:

%Vor%

Diese Zeile wird mehrere Millionen Mal aufgerufen und erweist sich als ziemlich intensiv. Ich habe versucht, etwas besseres zu schreiben, aber ich bin ratlos. Angesichts der recht bescheidenen Verarbeitungsanforderungen der Regex ist sicherlich etwas schneller. Könnte unsafe mit Zeigern weiter beschleunigen?

Bearbeiten:

Danke für die erstaunlichen Antworten auf diese Frage ... sehr unerwartet!

    
spender 27.04.2010, 10:16
quelle

8 Antworten

8

Das ist ungefähr dreimal schneller:

%Vor%     
Guffa 27.04.2010, 10:32
quelle
7

Wie wäre es damit ...

%Vor%

Testlauf mit NUnit:
Testzeit ist in Millisekunden.

%Vor% %Vor%

Bearbeiten:
Habe einige Tests gemacht und Guffas Methode "RemoveDuplicateSpaces" basierend auf StringBuilder hinzugefügt.
Meine Schlussfolgerung ist, dass die StringBuilder-Methode schneller ist, wenn es viele Leerzeichen gibt, aber mit weniger Leerzeichen ist die String-Split-Methode etwas schneller.

%Vor%     
Jens Granlund 27.04.2010 10:42
quelle
6

Gegenwärtig ersetzen Sie ein einzelnes Leerzeichen durch ein anderes einzelnes Leerzeichen. Versuchen Sie, \s{2,} (oder etwas Ähnliches, wenn Sie einzelne Zeilenumbrüche und andere Zeichen ersetzen möchten).

    
Kobi 27.04.2010 10:25
quelle
3

Nur ein Vorschlag, wenn Ihre Daten keine Unicode-Leerzeichen haben, statt \s+ verwenden [ \r\n]+ oder [ \n]+ oder nur  + (wenn nur Platz vorhanden ist), beschränken Sie sie grundsätzlich auf den minimalen Zeichensatz .

    
YOU 27.04.2010 10:22
quelle
3

Ich bin gespannt, wie eine einfache Implementierung aussehen könnte:

%Vor%     
Mitch Wheat 27.04.2010 10:32
quelle
3

Sie konnten keine regulären Ausdrücke verwenden. Zum Beispiel:

%Vor%

Mit dieser Methode und dem folgenden Testbett:

%Vor%

Ich habe folgende Ergebnisse erhalten:

%Vor%

Beachten Sie, dass dies nur mit einem sehr einfachen Beispiel getestet wurde. Es könnte weiter optimiert werden, indem der Aufruf von String.Trim entfernt wird und nur dafür gesorgt wird, dass reguläre Ausdrücke manchmal nicht die beste Antwort sind.

    
João Angelo 27.04.2010 10:30
quelle
0

Da es sich um einen einfachen Ausdruck handelt, ersetzen Sie zwei oder mehr Leerzeichen durch ein einzelnes Leerzeichen, entfernen Sie das Regex-Objekt und schreiben Sie das Ersetzen selbst (in C ++ / CLI):

%Vor%     
Skizz 27.04.2010 10:34
quelle
0

Arrays sind immer schneller

%Vor%     
Petar Petrov 27.04.2010 12:13
quelle

Tags und Links