.NET中的线程与进程

pow*_*tte 8 c# multithreading

我有一个长时间运行的进程,它读取大文件并写入摘要文件.为了加快速度,我使用常规旧线程同时处理多个文件:

ThreadStart ts = new ThreadStart(Work);
Thread t = new Thread(ts);
t.Start();
Run Code Online (Sandbox Code Playgroud)

我发现即使单独的线程读取单独的文件并且它们之间没有锁定并且在24核盒子上使用4个线程,我甚至无法在CPU上获得10%或在磁盘上获得10%I/O. 如果我在我的应用程序中使用更多线程,它似乎运行得更慢.

我猜我做错了什么,但是好奇的是,如果我第二次和第三次启动整个exe,那么它实际上处理文件的速度提高了两到三倍.我的问题是,为什么我不能在我的一个应用程序中获得12个线程来处理数据并对机器征税以及3个我的应用实例中的4个线程?

我已经分析了应用程序,最耗时和频繁调用的函数都是字符串处理调用.

Dav*_*nde 6

您的计算问题可能不受CPU限制,但I/O受限.说明您的磁盘I/O"仅为10%"并没有帮助.我不确定这样的性能计数器是否存在.

它在使用更多线程时变慢的原因是因为那些线程都试图同时到达它们各自的文件,而磁盘子系统很难试图容纳所有不同的线程.你看,即使采用像SSD这样的现代技术,寻道时间比传统硬盘小几个数量级,仍然会受到惩罚.

相反,您应该得出结论,您的问题是磁盘绑定的,单个线程可能是解决问题的最快方法.

有人可能会说你可以使用异步技术来处理已读取的位,而在后台读取下一位,但我认为你会看到很少的性能提升.

我不久前在一个小工具中遇到了类似的问题,我想计算硬盘上所有文件的MD5签名,我发现CPU与存储系统相比速度太快,我尝试了类似的结果通过使用更多线程获得更多性能.

使用任务并行库并没有缓解这个问题.


Ser*_* B. -1

尝试使用 .net 4 中的任务库(System.Threading.Task)。该库针对不同数量的处理器进行了内置优化。

不知道你的问题是什么,也许是因为你的代码片段并没有真正提供信息