由于没有不区分大小写的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()
如何比较性能?
是否有更有效的方法进行此类比较?
答案 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
变慢。但正如许多人提到的那样,分析它是确定的最好方法。我必须修复与正则表达式解析器相关的性能问题,toLower
和toUpper
从未回过头来咬我。