5

由于在 .NET 中不区分大小写string.Contains()(但存在不区分大小写的版本string.Equals()让我感到困惑,但我离题了),使用RegEx.IsMatch()与使用之间的性能差异是什么String.ToUpper().Contains()之间的性能差异是什么?

例子:

string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion";

bool containsString = RegEx.IsMatch(testString, "string", RegexOptions.IgnoreCase);
bool containsStringRegEx = testString.ToUpper().Contains("STRING");

我一直听说这string.ToUpper()是一个非常昂贵的调用,所以当我想进行比较时我会回避使用它string.Contains(),但是在性能方面如何RegEx.IsMatch()比较呢?

是否有更有效的方法来进行此类比较?

4

3 回答 3

16

这是一个基准

using System;
using System.Diagnostics;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main(string[] args)
    {
        Stopwatch sw = new Stopwatch();

        string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion";

        sw.Start();
        var re = new Regex("string", RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
        for (int i = 0; i < 1000000; i++)
        {
            bool containsString = re.IsMatch(testString);
        }
        sw.Stop();
        Console.WriteLine("RX: " + sw.ElapsedMilliseconds);

        sw.Restart();
        for (int i = 0; i < 1000000; i++)
        {
            bool containsStringRegEx = testString.ToUpper().Contains("STRING");
        }


        sw.Stop();
        Console.WriteLine("Contains: " + sw.ElapsedMilliseconds);

        sw.Restart();
        for (int i = 0; i < 1000000; i++)
        {
            bool containsStringRegEx = testString.IndexOf("STRING", StringComparison.OrdinalIgnoreCase) >= 0 ;
        }


        sw.Stop();
        Console.WriteLine("IndexOf: " + sw.ElapsedMilliseconds);
    }
}

结果是

IndexOf (183ms) > 包含 (400ms) > 正则表达式 (477ms)

(使用编译的正则表达式更新输出时间)

于 2013-07-10T19:38:52.343 回答
10

使用另一个版本String.IndexOf(String,StringComparison)可能比您建议的两个版本中的任何一个更有效:

string testString = "tHiSISaSTRINGwiThInconSISteNTcaPITaLIZATion";
bool contained = testString.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

如果您需要对文化敏感的比较,请使用CurrentCultureIgnoreCase而不是OrdinalIgnoreCase.

于 2013-07-10T19:36:48.250 回答
0

RegEx.match根据一般的正则表达式解析器的个人经验,我预计会很慢。但正如许多人所提到的,剖析它是确定问题的最佳方式。我不得不修复与正则表达式解析器相关的性能问题,toLower并且toUpper再也没有回来咬我。

于 2013-07-10T19:40:44.653 回答