【问题标题】:Does using Asynchronous method calls improve performance over .net threads使用异步方法调用是否可以提高 .net 线程的性能
【发布时间】:2012-03-02 04:21:56
【问题描述】:

我在这里阅读相互矛盾的意见。我对吗,虽然异步方法调用也由用户不可见的线程池处理,但这可能会节省资源,因为底层操作系统能够在 IO 调用挂起时挂起这些线程?

【问题讨论】:

  • 很多线程需要不断的上下文切换。
  • 请不要在您的标题前加上“.net”之类的前缀。这就是标签的用途。
  • 大量就绪线程需要不断的上下文切换。

标签: .net multithreading asynchronous methods pool


【解决方案1】:

你完全正确。 IO 线程不仅被挂起,而且在它们变得不需要时会被停用。但是异步 IO 并不是解决所有问题的通用解决方案,原因如下:

  • 异步算法很难编码。异步代码比同步变体更复杂且更容易出错
  • IO 完成回调在特殊的 IO 线程中工作,程序员必须尽可能保持这些线程空闲;否则系统会明显变慢。因此,如果您使用异步 IO,请准备好实施生产者-消费者模式以进行实际数据处理
  • 如果您需要少于 150 个并行连接并且应用程序在 PC 机器上运行,那么同步实现将是一个容易实现的目标,同时提供易于编程和令人满意的性能

【讨论】:

  • 虽然异步编程应该如上所述谨慎地进行。新的 5.0 特性将使 async 在编码中变得非常简单和富有表现力。我建议阅读 Eric Lippert 的文章以了解即将发生的事情:blogs.msdn.com/b/ericlippert/archive/2010/10/29/… 他还指出了异步的一些优点。我知道这是未来,但根据这个问答,它似乎会有所帮助:)
【解决方案2】:

理想情况下,如果可能,您将使用 .net 4.0 System.Threading.Tasks.Parallel 类。它将利用多核处理器。

而且很简单。

【讨论】:

    【解决方案3】:

    '异步方法调用也由用户不可见的线程池处理' - 是的,必须做一些 I/O!

    '这可能会节省资源,因为底层操作系统能够在 IO 调用挂起时挂起这些线程' - 操作系统也能够在 I/O 挂起时挂起用户线程。

    在高性能应用程序中,异步获胜,因为更多工作​​被推入内核,从而可以进行更好的线程管理。这确实减少了上下文切换,也避免了大量的数据复制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 2019-03-24
      • 2019-05-22
      相关资源
      最近更新 更多