在应用程序分析期间,我发现检查模式匹配的功能非常慢。它是使用 LINQ 编写的。用循环简单地替换这个 LINQ 表达式会产生很大的不同。它是什么?LINQ 真的是一件坏事并且工作如此缓慢还是我误解了什么?
private static bool PatternMatch1(byte[] buffer, int position, string pattern)
{
int i = 0;
foreach (char c in pattern)
{
if (buffer[position + i++] != c)
{
return false;
}
}
return true;
}
带有 LINQ 的版本 2(由 Resharper 建议)
private static bool PatternMatch2(byte[] buffer, int position, string pattern)
{
int i = 0;
return pattern.All(c => buffer[position + i++] == c);
}
带有 LINQ 的版本 3
private static bool PatternMatch3(byte[] buffer, int position, string pattern)
{
return !pattern.Where((t, i) => buffer[position + i] != t).Any();
}
版本 4 使用 lambda
private static bool PatternMatch4(byte[] buffer, int position, string pattern, Func<char, byte, bool> predicate)
{
int i = 0;
foreach (char c in pattern)
{
if (predicate(c, buffer[position + i++]))
{
return false;
}
}
return true;
}
这是大缓冲区的用法
const int SIZE = 1024 * 1024 * 50;
byte[] buffer = new byte[SIZE];
for (int i = 0; i < SIZE - 3; ++i)
{
if (PatternMatch1(buffer, i, "xxx"))
{
Console.WriteLine(i);
}
}
调用PatternMatch2
orPatternMatch3
非常慢。大约需要 8 秒PatternMatch3
, 大约需要 4 秒PatternMatch2
,而调用PatternMatch1
大约需要 0.6。据我了解,它是相同的代码,我看不出有什么区别。有任何想法吗?