我有一组XML文件,我想将它们加载到内存中进行处理。
我正在将文件加载到集合中,如果我在单个线程中加载文件,而不是使用线程池,似乎会快得多。
我本以为情况会相反。
为什么使用多个线程将文件加载到内存中的速度比我只遍历文件列表并在单个线程上一个接一个地加载每个文件的速度慢得多?
这是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);
}
如果看不到代码,很难判断。如果XML的大小和/或数量很小,并且您只有一个CPU,那么可能只是线程之间的上下文切换所花费的时间比简单读取文件所需的时间要长。
编辑
现在我看到了您创建的代码,线程太多了。我建议你使用Parallel。为TPL。这可用于。净3.5
请参阅http://msdn.microsoft.com/en-us/magazine/cc163340.aspx了解更多关于TPL的信息。
如果没有看到代码,我想这可能与从磁盘读取是操作的缓慢部分有关。由于磁盘一次只能读取一个文件,因此磁盘成为了瓶颈。
当您需要对多线程和单线程进行决策时,您需要进行基准测试,最好是在运行应用程序的机器上。
由于线程同步的额外开销,多线程代码可能会更慢。即使使用ThreadPool,也会有创建线程的初始开销。
如果不知道要解决的问题的细节,很难提出单线程或多线程更好的建议。
此外,在没有看到代码的情况下,很难判断为什么一个代码比另一个代码慢。