【问题标题】:Why do .NET threads have inferior performance to separate .NET processes?为什么 .NET 线程的性能不如分离 .NET 进程?
【发布时间】: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


【解决方案1】:

我的猜测与 svick 的猜测相同:您可能遇到了运行时插入的某种瓶颈。

一般来说,您可以使用 Fiddler 或 Wireshark 之类的工具来查看 10 次下载是如何交错的。在您的情况下,我希望任何时候只有两个活动,一旦一个完成,另一个将立即开始。

在更改设置之前,您应该了解它存在的原因。它被写入 HTTP 规范作为建议的客户端行为,以免使服务器不堪重负。如果您的代码要分发到成百上千/百万台机器上,您应该考虑每个客户端同时下载 10 次的影响。

【讨论】:

    猜你喜欢
    • 2011-06-08
    • 2022-01-12
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多