如何提高 LINQ 查询的速度?
我之前使用的是 long.TryParse,但后来改用了正则表达式。目前,123+K 条消息总共需要 7+ 毫秒。 7+ 毫秒是从 XElement.Parse 到 foreach 方法结束的时间。
Stopwatch s1 =Stopwatch.StartNew();
XElement element = XElement.Parse(xml);
string pattern = @"\b\d+\b";
Regex r = new Regex(pattern);
IEnumerable<XElement> elementsWithPossibleCCNumbers = element
.Descendants()
.Where(d => d.Attributes()
.Where(a => a.Value.Length >= 13 &&
a.Value.Length <= 16 &&
r.IsMatch(a.Value)).Count() == 1)
.Select(x => x);
foreach(var x in elementsWithPossibleCCNumbers)
{
foreach(var a in x.Attributes())
{
//Check if the value is a number
if(r.IsMatch(a.Value))
{
//Check if value is the credit card
if(a.Value.Length >= 13 && a.Value.Length <= 16)
{
a.Value = Regex.Replace(a.Value, @"\b\d{13,16}\b", match =>
new String('*', match.Value.Length - 4) +
match.Value.Substring(match.Value.Length - 4)
);
}
else //If value is not a credit card, replace it with ***
a.Value = Regex.Replace(a.Value ,@"\b\d+\b", "***");
}
}
}
xml = element.ToString();
s1.Stop();
XElement.Parse(xml);
需要 2 - 3 毫秒。
LINQ 查询需要 0.004 - 0.005 毫秒。
foreach 语句需要 4 - 5 毫秒。
I was using long.TryParse
, but switched to regex. Currently, it takes a total of 7+ milliseconds for a 123+K message. The 7+ milliseconds is from the XElement.Parse to the end of the foreach methods.
Stopwatch s1 =Stopwatch.StartNew();
XElement element = XElement.Parse(xml);
string pattern = @"\b\d+\b";
Regex r = new Regex(pattern);
IEnumerable<XElement> elementsWithPossibleCCNumbers = element
.Descendants()
.Where(d => d.Attributes()
.Where(a => a.Value.Length >= 13 &&
a.Value.Length <= 16 &&
r.IsMatch(a.Value)).Count() == 1)
.Select(x => x);
foreach(var x in elementsWithPossibleCCNumbers)
{
foreach(var a in x.Attributes())
{
//Check if the value is a number
if(r.IsMatch(a.Value))
{
//Check if value is the credit card
if(a.Value.Length >= 13 && a.Value.Length <= 16)
{
a.Value = Regex.Replace(a.Value, @"\b\d{13,16}\b", match =>
new String('*', match.Value.Length - 4) +
match.Value.Substring(match.Value.Length - 4)
);
}
else //If value is not a credit card, replace it with ***
a.Value = Regex.Replace(a.Value ,@"\b\d+\b", "***");
}
}
}
xml = element.ToString();
s1.Stop();
XElement.Parse(xml);
takes between 2 - 3 ms.
The LINQ query takes between 0.004 - 0.005 ms.
The foreach statements take between 4 - 5 ms.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您似乎正在执行两次搜索和替换:
*
和最后 4 位数字*
的。一种方法是让 XLinq 为您工作得更困难一些:
示例输入 XML:
输出:
It appears you're doing two search and replacements:
*
's and the last 4 digits*
's.One approach would be to make XLinq work a little bit harder for you:
Sample input XML:
Output:
您可能需要考虑预编译您的正则表达式。此处的文章: http://en.csharp-online.net/CSharp_Regular_Expression_Recipes%E2 %80%94Compiling_Regular_Expressions 解释了编译的优缺点正则表达式非常好。
You may want to consider precompiling your regex. The article here: http://en.csharp-online.net/CSharp_Regular_Expression_Recipes%E2%80%94Compiling_Regular_Expressions explains the pro and cons of compiling regex quite nicely.