哪个更快:正则表达式或字符串操作
本文关键字:字符串 操作 正则表达式 | 更新日期: 2023-09-27 18:14:23
何时应该在字符串操作上使用正则表达式,反之亦然,仅考虑性能?
看情况
虽然字符串操作通常会更快一些,但实际性能很大程度上取决于许多因素,包括:
- 解析正则表达式的次数
- 你的字符串代码写得多聪明
- 是否预编译正则表达式
随着正则表达式变得越来越复杂,编写性能良好的等效字符串操作代码将花费更多的精力和复杂性。
字符串操作总是比正则表达式操作快。当然,除非您以一种低效的方式编写字符串操作。
必须解析正则表达式,并生成代码以使用字符串操作执行操作。在最好的情况下,正则表达式操作可以做最优的字符串操作。
使用正则表达式不是因为它们可以比普通字符串操作更快,而是因为它可以用很少的代码完成非常复杂的操作,并且开销相当小。
我用两个函数FunctionOne(字符串操作)和FunctionTwo(正则表达式)做了一些基准测试。它们都应该得到'<'和'>'之间的所有匹配。
基准#1:- 被调用次数:1'000'000
- 输入:80个字符
- duration (string operations//FunctionOne): 1.12 sec
- duration (regex operation//FunctionTwo): 1.88 sec
- 被调用次数:1'000'000
- 输入:2000字符
- 持续时间(字符串操作):27.69秒
- 持续时间(正则表达式操作):41.436秒
结论:如果编程效率高,字符串操作几乎总是优于正则表达式。但是,它变得越复杂,字符串操作就越难跟上,不仅在性能方面,而且在维护方面。
代码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);
}
}
}
代码FunctionTwo
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 to Objects.
2) Lambda表达式。
3)传统迭代法。
所有3种方法都在使用和不使用正则表达式时进行了测试。我的测试用例的结论很清楚,当在大量文本中搜索字符串时,在所有3种情况下,正则表达式都比非正则表达式慢得多。
你可以在我的博客上阅读细节:http://www.midniteblog.com/?p=72