【发布时间】:2014-06-06 03:24:23
【问题描述】:
我对包含大约 35 万个项目的字典进行了三个测试。我需要看看我可以在 30 秒内迭代多少项。
我的初始测试只是遍历字典,没有检查,也没有 UI/控制台更新。它在开始测试后仅一秒钟就完成了。
第二个测试是将计数写入控制台。已达到约 23,600 项。
foreach (KeyValuePair<UInt64, MftFile> entry in mftFiles)
{
fileCount++;
Console.WriteLine(fileCount.ToString());
}
然后我测试了在使用计数更新表单时它的运行速度。它只达到了 16000 多件。
foreach (KeyValuePair<UInt64, MftFile> entry in mftFiles)
{
fileCount++;
MessageReceived(this, GetMessageReceivedEventArgs("Proactive Checks - RIFT",
string.Format("Analyzing Drive {0} - MFT Record {1} of {2}", drive.Name, fileCount.ToString(), mftFiles.Count.ToString()), string.Empty));
}
在循环中执行任何类型的条件逻辑都会大大减慢循环速度。我最初在循环之外创建了一个秒表,并在循环内部检查它以查看它何时到达某个时间。一分钟多过去了,它只迭代了大约 5000 多个项目。
有一个 C++ 应用程序与我正在做的事情类似。它只需不到 60 秒的时间就可以遍历所有 300,000 个项目、更新 UI、查找所有重复项并为每个重复项创建哈希。
有没有更好的方法来遍历字典?
【问题讨论】:
-
这取决于您在 MessageRecieved 方法中执行的操作,但您可能希望对 UI 进行一些异步更新,因此它不会延迟 for 循环。此外,您可以使用模数运算符仅更新 UI,例如每 5 次或每 10 次循环。
标签: c# winforms loops dictionary