根据我自己的经验,每当我使用简单的字符串操作对正则表达式解决方案与自定义解析器进行基准测试时,正则表达式解决方案都会慢一些。那是因为他们经常遭受回溯的困扰。
但出于好奇,我写了一个小测试,看看你所说的在最简单的例子中是否属实。
这是我的测试...
private static Regex RegexSearch = new Regex("Audi A4", RegexOptions.Compiled);
static void Main(string[] args)
{
// warm up the JIT compiler
FoundWithRegexIsMatch();
FoundWithStringContains();
FoundWithStringIndexOf();
// done warming up
int iterations = 100;
var sw = new Stopwatch();
sw.Restart();
for (int i = 0; i < iterations; i++)
{
FoundWithRegexIsMatch();
}
sw.Stop();
Console.WriteLine("Regex.IsMatch: " + sw.ElapsedMilliseconds + " ms");
sw.Restart();
for (int i = 0; i < iterations; i++)
{
FoundWithStringIndexOf();
}
sw.Stop();
Console.WriteLine("String.IndexOf: " + sw.ElapsedMilliseconds + " ms");
sw.Restart();
for (int i = 0; i < iterations; i++)
{
FoundWithStringContains();
}
sw.Stop();
Console.WriteLine("String.Contains: " + sw.ElapsedMilliseconds + " ms");
}
private static bool FoundWithStringContains()
{
return Resource2.csv.Contains("Audi A4");
}
private static bool FoundWithStringIndexOf()
{
return Resource2.csv.IndexOf("Audi A4") >= 0;
}
private static bool FoundWithRegexIsMatch()
{
return RegexSearch.IsMatch(Resource2.csv);
}
我正在针对我拥有的大约 1.2 MB 的 CSV 文件进行测试。结果如下:
- 正则表达式.IsMatch:172 毫秒
- String.IndexOf:172 毫秒
- 字符串。包含:185 毫秒
确实你是对的。当你没有在正则表达式中做任何花哨的事情时,正则表达式比String.Contains
操作快一点。但是,我发现String.Contains 中存在一点点开销,并且调用String.IndexOf
速度更快,并且实际上匹配Regex.IsMatch
到毫秒的时间。
这些相同的时间是可疑的。我想知道在编译过程中是否确定这实际上不需要通过正则表达式引擎(因为我上面使用的模式中没有特定于正则表达式的指令)。相反,它可以被简化,以便Regex.IsMatch
从 kernel32.dll 对 FindNLSString 进行相同的调用IndexOf
。这只是一个猜测。