【发布时间】:2012-06-03 11:41:46
【问题描述】:
最近我一直在观察一个有趣的现象,在我基于它重新设计我的整个软件架构之前,我想知道为什么会发生这种情况,以及是否有可能使线程性能与进程性能相提并论。
通常,任务是下载某些数据。如果我们做一个 6 线程的进程,基于 Parallel 库,下载大约需要 10 秒。
但是,如果我们创建 6 个进程,每个进程都是单线程的,并下载相同的数据,那么整个过程只需要大约 6 秒。
这些数字经过彻底验证且具有统计意义,因此请务必将其视为理所当然。
观察结果适用于大型(100 次试验)数据集,我没有观察到与这种行为的偏差。
基本上,问题是,为什么非同步多线程进程比具有完全相同工作代码的几个单独进程慢,以及如何修复它?
提前致谢!
注意:我读过类似的问题,但答案并不令人满意和实用。
【问题讨论】:
-
您没有提供足够的信息来正确回答您的问题,但我的水晶球告诉我这可能是因为 .Net 默认情况下将与单个服务器的并发 HTTP 连接数限制为 2 .见ServicePointManager.DefaultConnectionLimit。
-
调用 ThreadPool.SetMinThreads(6, 10000) 再试一次。
-
TPL 的默认任务调度程序可能需要一段时间来启动新线程。它是为简短的、不受 IO 限制的 CPU 限制任务而设计的。因此,通过创建流程,您可能会更快地参与到行动中。此外,.NET 垃圾收集器有时会阻塞所有线程(取决于您使用的版本)。显然,一个进程 = 一个 GC,因此阻塞更少。 TL;DR 疯狂猜测:提供更多信息。
-
您似乎在误认为并行 = 更快。并行化可能会更快,也可能会慢很多,具体取决于任务。
-
另外,查看您的代码会有所帮助。 如何你做这件事通常很重要。
标签: c# multithreading performance