什么更快:正则表达式或字符串操作?
什么时候我应该使用Regex而不是字符串操作,反之亦然只考虑性能?
这取决于
虽然字符串操作通常会更快,但实际性能在很大程度上取决于许多因素,包括:
- 你解析正则表达式的次数
- 你编写字符串代码有多聪明
- 正则表达式是否已预编译
随着正则表达式变得更加复杂,编写运行良好的等效字符串操作代码将花费更多的精力和复杂性。
我用两个函数做了一些基准测试,这两个函数叫做FunctionOne(字符串操作)和FunctionTwo(Regex)。 他们应该得到’<'和'>‘之间的所有匹配。
基准#1:
- 时间称:1’000’000
- 输入:80个字符
- duration(字符串操作// FunctionOne):1.12秒
- 持续时间(正则表达式操作// FunctionTwo):1.88秒
基准#2:
- 时间称:1’000’000
- 输入:2000个字符
- 持续时间(字符串操作):27.69秒
- 持续时间(正则表达式操作):41.436秒
结论:如果有效编程,字符串操作几乎总是会超过正则表达式。 但是它越复杂,字符串操作就越难以保持性能问题,而且还要保持维护。
代码function1
private void FunctionOne(string input) { var matches = new List(); 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); } } }
代码function2
Regex regx = new Regex("<.*?>"); private void FunctionTwo(string input) { Match m = regx.Match(input); var results = new List(); 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