我有一组XML文件,我想加载到内存中以便处理。
我正在将文件加载到Collection中,如果我在单个线程中加载文件而不是使用线程池,它似乎要快得多。
我原以为这会是另一种方式。
为什么使用多个线程将文件加载到内存中的速度明显慢于我只是遍历文件列表并在一个线程上一个接一个地加载每个文件?
这是使用C#.net 3.5
代码:
ICollection<XmlDocument> xmlFilesToProcess = new Collection<XmlDocument>();
foreach (FileInfo fileInfo in fileList)
{
ThreadPool.QueueUserWorkItem(
(o) =>
{
XmlDocument doc = new XmlDocument();
doc.Load((string)o);
lock (xmlFilesToProcess)
{
xmlFilesToProcess.Add(doc);
counter++;
}
}, fileInfo.FullName);
}
答案 0 :(得分:2)
没有看到代码,很难说清楚。如果XML的大小和/或数量很小并且您只有一个CPU,则可能只是线程之间的上下文切换花费的时间比简单读取文件所需的时间长。
修改强>
现在我看到你创建的代码太多了。我建议你使用TPL的Parallel.For。这适用于.Net 3.5
有关TPL的更多信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc163340.aspx。
答案 1 :(得分:1)
没有看到代码,我猜它可能与从磁盘读取是操作的缓慢部分这一事实有关。由于磁盘实际上只能一次读取一个文件,因此磁盘成为瓶颈。
答案 2 :(得分:0)
每当您需要对多线程与单线程做出决策时,您需要进行基准测试,最好是在要运行应用程序的计算机上进行基准测试。
由于线程同步的额外开销,多线程代码可能会变慢。即使你使用ThreadPool,也会有线程创建的初始开销。
如果不了解要解决的问题的详细信息,很难建议什么是更好的单线程或多线程。
此外,如果没有看到代码,很难说出为什么一个代码比另一个代码慢。