我什么时候应该在字符串操作上使用正则表达式,反之亦然,只考虑性能?
4 回答
这取决于
尽管字符串操作通常会更快一些,但实际性能在很大程度上取决于许多因素,包括:
- 你解析了多少次正则表达式
- 你写你的字符串代码有多聪明
- 正则表达式是否预编译
随着正则表达式变得越来越复杂,编写性能良好的等效字符串操作代码将花费更多的精力和复杂性。
字符串操作总是比正则表达式操作快。当然,除非您以低效的方式编写字符串操作。
必须解析正则表达式,并生成代码以使用字符串操作执行操作。充其量,正则表达式操作可以做最好的字符串操作。
不使用正则表达式是因为它们可以比普通字符串操作更快地执行任何操作,使用它是因为它可以用很少的代码执行非常复杂的操作,并且开销相当小。
我用两个函数做了一些基准测试,分别是 FunctionOne(字符串操作)和 FunctionTwo(正则表达式)。他们都应该得到 '<' 和 '>' 之间的所有匹配项。
基准#1:
- 调用次数:1'000'000
- 输入:80 个字符
- 持续时间(字符串操作 // FunctionOne):1.12 秒
- 持续时间(正则表达式操作//FunctionTwo):1.88 秒
基准#2:
- 调用次数:1'000'000
- 输入:2000 个字符
- 持续时间(字符串操作):27.69 秒
- 持续时间(正则表达式操作):41.436 秒
结论:如果编程高效,字符串操作几乎总能胜过正则表达式。但它越复杂,字符串操作就越难以跟上性能问题,而且在维护方面也越难跟上。
代码功能一
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);
}
}
}
代码功能二
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();
}
}
不久前,我在 C# 中做了一些分析,比较了以下内容:
1)LINQ 到对象。
2) Lambda 表达式。
3)传统的迭代方法。
所有 3 种方法都在使用和不使用正则表达式的情况下进行了测试。我的测试用例的结论很清楚,在大量文本中搜索字符串时,在所有 3 种情况下,正则表达式都比非正则表达式慢很多。
您可以在我的博客上阅读详细信息:http: //www.midniteblog.com/? p=72