什么更快:正则表达式或字符串操作?

时间:2013-05-19 19:33:46

标签: c# regex string performance

我应该何时使用Regex而不是字符串操作,反之亦然只考虑性能?

4 个答案:

答案 0 :(得分:17)

取决于

尽管字符串操作通常会稍快一些,但实际性能在很大程度上取决于许多因素,包括:

  • 解析正则表达式的次数
  • 你写字符串代码的巧妙程度
  • 正则表达式是否已预编译

随着正则表达式变得越来越复杂,编写表现良好的等效字符串操作代码将花费更多的精力和复杂性。

答案 1 :(得分:6)

我用两个函数做了一些基准测试,这两个函数叫做FunctionOne(字符串操作)和FunctionTwo(Regex)。他们应该得到'<'之间的所有匹配和'>'。

基准#1:

  • 次:1'000'000
  • 输入:80个字符
  • duration(字符串操作// FunctionOne):1.12秒
  • 持续时间(正则表达式操作//功能2):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();
        }
    }

答案 2 :(得分:5)

字符串操作总是比正则表达式操作更快。当然,除非你以低效的方式编写字符串操作。

必须解析正则表达式,并生成代码以使用字符串操作执行操作。充其量,正则表达式操作可以做最好的字符串操作。

不使用正则表达式,因为它们可以比纯字符串操作更快地执行任何操作,因为它可以用很少的代码执行非常复杂的操作,而且开销相当小。

答案 3 :(得分:1)

我在C#中做了一些分析,比较以下内容:

1)LINQ to Objects。

2)Lambda表达式。

3)传统的迭代方法。

所有3种方法均使用和不使用正则表达式进行测试。 在我的测试用例中得出的结论很清楚,在大量文本中搜索字符串时,正则表达式在所有3种情况下都比非正则表达式慢很多。

您可以在我的博客上阅读详细信息: http://www.midniteblog.com/?p=72