在性能方面,什么时候应该使用正则表达式而不是字符串操作,反之亦然?
在性能方面,什么时候应该使用正则表达式而不是字符串操作,反之亦然?
虽然字符串操作通常会稍微快一些,但实际性能严重取决于许多因素,包括:
随着正则表达式变得更加复杂,编写等效的字符串操作代码以获得良好性能将需要更多的努力和复杂性。
字符串操作总是比正则表达式操作更快。当然,除非您以低效的方式编写字符串操作。
正则表达式必须被解析,并生成用于执行操作的代码,这需要使用字符串操作。在最好的情况下,正则表达式操作可以做到最优化的字符串操作。
正则表达式之所以被使用,并不是因为它们可以比普通字符串操作更快地完成任何事情,而是因为它们可以用很少的代码和合理小的开销来执行非常复杂的操作。
我进行了两个函数的基准测试,它们分别被称为FunctionOne (字符串操作)和FunctionTwo (正则表达式)。 它们都应该会获取在'<'和'>'之间的所有匹配项。
基准测试#1:
基准测试#2:
结论:如果以高效的方式编程,字符串操作几乎总是能够击败正则表达式。但是随着问题变得越来越复杂,字符串操作不仅在性能方面,而且在维护方面都越来越难以跟上。
代码FunctionOne
private void FunctionOne(string input) {
var matches = new List<string>();
var match = new StringBuilder();
Boolean startRecording = false;
foreach( char c in input) {
if (c.Equals('<')) {
startRecording = true;
continue;
}
if (c.Equals('>')) {
matches.Add(match.ToString());
match = new StringBuilder();
startRecording = false;
}
if (startRecording) {
match.Append(c);
}
}
}
代码函数2
Regex regx = new Regex("<.*?>");
private void FunctionTwo(string input) {
Match m = regx.Match(input);
var results = new List<string>();
while (m.Success) {
results.Add(m.Value);
m = m.NextMatch();
}
}
RegexOptions.Compiled
,则速度会更快。 - SLaks'<'
。 - SLaks[^>]*
可能会更快。 - SLaks