【发布时间】:2011-01-27 18:26:23
【问题描述】:
我有一个Dictionary<int, MyClass>
它包含 100,000 个项目
10,000 个项目值已填充,而 90,000 个为空。
我有这个代码:
var nullitems = MyInfoCollection.Where(x => x.Value == null).ToList();
nullitems.ForEach(x => LogMissedSequenceError(x.Key + 1));
private void LogMissedSequenceError(long SequenceNumber)
{
DateTime recordTime = DateTime.Now;
var errors = MyXDocument.Descendants("ERRORS").FirstOrDefault();
if (errors != null)
{
errors.Add(
new XElement("ERROR",
new XElement("DATETIME", DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss:fff")),
new XElement("DETAIL", "No information was read for expected sequence number " + SequenceNumber),
new XAttribute("TYPE", "MISSED"),
new XElement("PAGEID", SequenceNumber)
)
);
}
}
这似乎需要大约 2 分钟才能完成。我似乎找不到瓶颈可能在哪里,或者这个时间听起来是否正确?
谁能看出为什么要花这么长时间?
【问题讨论】:
-
使用调试跟踪查看查询需要多长时间,以及日志记录需要多长时间。此外,在处理 100,000 项文档时,XML 可能会产生大量处理开销。
-
您是否运行了分析器?我很想知道你为什么运行 DateTime.now 两次(因为调用它相对昂贵)以及调用 90k 次时它到底有多慢......
-
我删除了 DateTime 并且只调用它一次并将其作为字符串传递。我没有 Visual Studio Team 等,其中包含 Profiler。
-
如果您检查一下,您可能会发现在每次调用时查找“ERRORS”元素是最昂贵的部分之一。或者将 ERRORS 元素传递给方法,或者使用 LINQ 来发挥您的优势,如下所述。
标签: c# linq .net-3.5 c#-3.0 linq-to-xml