Multithreading C#多线程处理一个CPU少得多的进程比CPU多得多的进程要快

Multithreading C#多线程处理一个CPU少得多的进程比CPU多得多的进程要快,multithreading,c#-4.0,concurrency,Multithreading,C# 4.0,Concurrency,目前,我们的应用程序正在处理同一目录中的大量文件,大约1000多个XML文件。所有文件都将被读取、解析并更新/保存到数据库中 当我们在12核机器上测试应用程序时,整个过程要比在4核机器上处理慢得多 我们观察到,我们的应用程序产生的线程数增加到30到90个线程,并且上下文切换大量增加。这可能是由于产生了大量并行执行,但所有这些都很重要 上下文切换是罪魁祸首吗?还是文件的并行读/写?还是我们减少了并行任务的数量?这里的瓶颈是磁盘访问。无论启动多少线程,文件系统一次只能读取一个文件。启动更多线程只会让

目前,我们的应用程序正在处理同一目录中的大量文件,大约1000多个XML文件。所有文件都将被读取、解析并更新/保存到数据库中

当我们在12核机器上测试应用程序时,整个过程要比在4核机器上处理慢得多

我们观察到,我们的应用程序产生的线程数增加到30到90个线程,并且上下文切换大量增加。这可能是由于产生了大量并行执行,但所有这些都很重要


上下文切换是罪魁祸首吗?还是文件的并行读/写?还是我们减少了并行任务的数量?

这里的瓶颈是磁盘访问。无论启动多少线程,文件系统一次只能读取一个文件。启动更多线程只会让它们争夺这一单一资源,从而增加上下文切换和磁盘寻道时间

在进程的另一端也是一个限制,因为一次只有一个线程可以更新数据库中的表,但数据库设计用于处理多个进程


让一个线程负责磁盘读取,一旦文件被读取,它就可以启动一个线程来处理它。通过这种方式,您可以以最有效的方式从磁盘读取数据,而操作的多线程部分就隐藏在瓶颈后面。

能否发布一些代码?设计?你是如何进行线程间通信的?您是否将整个文件读入某个XML容器并将其排入处理池?感谢Guffa的快速回答,但负责磁盘读取的线程已经在单个线程中。虽然这对我们还是有帮助的。