Я использовал long.TryParse
, но переключился на регулярное выражение. В настоящее время для сообщения 123 + K требуется 7+ миллисекунд. 7+ миллисекунд - от XElement.Parse до конца методов foreach.Как я могу улучшить скорость этого запроса LINQ?
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 мс.
Действительно только 7MS ? Звучит неплохо. – user7116
@sixlettervariables - Да, для одного сообщения это хорошо, но у меня есть тонна этих прихожей, поэтому его объем сообщений. – Xaisoft
Вы пробовали статическое скомпилированное регулярное выражение? –