Ich arbeite mit einer ziemlich großen Reihe von Strings, die ich so schnell wie möglich verarbeiten muss.C# -Performance - Regex vs. multiple Split
Das Format ist ziemlich festgelegt:
[name]/[type]:[list ([key] = [value],)]
oder
[name]/[type]:[key]
Ich hoffe, meine Darstellung in Ordnung ist. Was das bedeutet ist, dass ich ein Wort habe (in meinem Fall nenne ich es Name
), dann einen Schrägstrich, gefolgt von einem anderen Wort (ich nenne es Type
), dann einen Doppelpunkt, und es folgt entweder eine kommagetrennte Liste von Schlüssel-Wert-Paare (key
=
value
) oder ein einzelner Schlüssel.
Name
, Type
kann keine Leerzeichen enthalten, aber die key
und value
Felder können.
Derzeit Regex Ich verwende diese Daten zu analysieren, und eine Spaltung:
var regex = @"(\w+)\/(\w+):(.*)";
var r = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Singleline);
var m = r.Match(Id);
if (m.Success) {
Name = m.Groups[1].Value;
Type= m.Groups[2].Value;
foreach (var intern in m.Groups[3].Value.Split(','))
{
var split = intern.Trim().Split('=');
if (split.Length == 2)
Items.Add(split[0], split[1]);
else if (split.Length == 1)
Items.Add(split[0], split[0]);
}
}
Jetzt weiß ich dies nicht der Fall ist optional, aber ich bin nicht sicher, was die schnellste sein würde:
- Split die Zeichenfolge zuerst vom
:
dann durch/
für das erste Element, und,
für die zweite, verarbeiten diese dann Liste und Split wieder durch=
- die aktuelle Mischung verwenden, wie es
- Nutzung ist ein völlig regex-basierte
Natürlich ist offen für Vorschläge sind, mein Hauptziel ist es, die schnellste Verarbeitung dieser Einzelsaite zu erreichen.
Wenn die Schlüssel oder Werte ':' oder '/' haben können, sollten Sie sich an die Regex halten. –
_ "Mein Hauptziel ist es, die schnellste Verarbeitung dieser einzelnen Saite zu erreichen" _ - so ** measure ** die verschiedenen Ansätze. Sie können dafür die Stoppuhr-Klasse verwenden: Am besten in der Release-Konfiguration, um die Tests mehrmals auszuführen und das durchschnittliche Ergebnis zu verwenden. – stuartd
Regex ist normalerweise keine optimale Lösung, da es für allgemeine Anwendungsfälle (allgemeiner Code ist normalerweise nicht optimal) gebaut wird. Sie müssen möglicherweise in Erwägung ziehen, Ihren eigenen Code zu schreiben, um dies zu tun –