Ich habe eine Methode, um jedes Zeichen außer den angegebenen zu ersetzen. Zum Beispiel
%Vor%würde zurückkehren
%Vor%Dies ist keine vorzeitige Optimierung. Ich rufe diese Methode während einer Netzwerkoperation einige Male auf. Ich habe festgestellt, dass es bei längeren Saiten etwas Latenz verursacht, und das Entfernen hat etwas geholfen. Jede Hilfe, um dies zu beschleunigen, würde geschätzt werden.
%Vor%Schluss # s. Ich fügte auch einen Testfall für eine 3K Zeichenkette hinzu, lief bei 100K mal anstelle von 1M, um zu sehen, wie gut jede dieser Skalen ist. Die einzige Überraschung war, dass der reguläre Ausdruck "besser skaliert" ist als die anderen, aber es ist keine Hilfe, da er sehr langsam ist:
%Vor%Update: Ich habe die Erstellung des regulären Ausdrucks für Peters Version eine statische Variable gemacht und sie auf RegexOptions.Compiled gesetzt, um fair zu sein:
%Vor%Pastebin Link zu meinem Testcode, bitte korrigieren Sie mich wenn es falsch ist: Ссылка
Alles klar, bei einer ~ 60KB-Zeichenfolge wird dies ungefähr 40% schneller als bei Ihrer Version sein:
%Vor%Der Trick besteht darin, eine neue Zeichenfolge mit allen Ersatzzeichen zu initialisieren, da die meisten von ihnen ersetzt werden.
Ich weiß nicht, ob das schneller geht, aber es vermeidet, Strings neu zu erzeugen, nur damit sie an den String Builder angehängt werden können, was helfen kann:
%Vor% Wenn die Anzahl der Zeichen in Für solch eine einfache Transformation würde ich wetten, dass es kein Problem haben wird, schneller zu sein als eine Regex. Da Ihre Zeichengruppe in oder besser, haben Sie eine Überladung, wobei pattern
eine beliebige Größe hat (was ich im Allgemeinen nicht glaube), könnte es sich lohnen, sie zu sortieren und eine Array.BinarySearch()
anstelle von Array.indexOf()
. pattern
wahrscheinlich ohnehin aus einer Zeichenkette stammt (zumindest war das bei dieser Art von API meine allgemeine Erfahrung), warum haben Sie nicht die Methodensignatur be: pattern
ein char[]
oder string
sein kann?
Der StringBuilder hat eine Überladung, die ein Zeichen und eine Zählung erfordert, so dass Sie keine Zwischenzeichenfolgen zum Hinzufügen zum StringBuilder erstellen müssen. Ich erhalte eine Verbesserung von 20%, indem ich Folgendes ersetze:
%Vor%mit:
%Vor%und das:
%Vor%mit:
%Vor%(Ich habe den Code, den du gesagt hast, ungefähr viermal schneller getestet und finde ihn ungefähr 15 mal langsamer ...)
Es wird O (n) sein. Sie scheinen alle Alphabete und Leerzeichen durch *
zu ersetzen, warum testen Sie nicht einfach, ob das aktuelle Zeichen ein Alphabet / Leerzeichen ist und ersetzen Sie es?
Tags und Links string c# performance stringbuilder