RegEx.IsMatch()与String.ToUpper()。包含()性能

时间:2013-07-10 19:32:19

标签: c# regex string

由于没有不区分大小写的string.Contains()(但是string.Equals()的不区分大小写的版本存在让我感到困惑,但我离题了),使用{{1}之间的性能差异是什么? }使用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()如何比较性能?

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

3 个答案:

答案 0 :(得分: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)&gt;包含(400毫秒)&gt;正则表达式(477毫秒)

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

答案 1 :(得分:10)

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

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

如果您需要对文化敏感的比较,请使用CurrentCultureIgnoreCase代替OrdinalIgnoreCase

答案 2 :(得分:0)

基于普通表达式解析器的个人经验,我希望RegEx.match变慢。但正如许多人提到的那样,分析它是确定的最好方法。我必须修复与正则表达式解析器相关的性能问题,toLowertoUpper从未回过头来咬我。