哪个更快:正则表达式或字符串操作

本文关键字:字符串 操作 正则表达式 | 更新日期: 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
基准#2:
  • 被调用次数: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