gpt4 book ai didi

multithreading - 为什么异步被认为比多线程性能更好?

转载 作者:行者123 更新时间:2023-12-03 13:40:17 25 4
gpt4 key购买 nike

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




我了解异步和多线程编程,并且我都做过并且可以轻松完成。然而,有一件事仍然困扰着我:为什么普遍认为异步比多线程性能更好? ( 补充: 我说的是两种方法都可行并且您可以做出选择的情况)

乍一看,原因似乎很明显 - 线程更少,操作系统调度程序的工作更少,堆栈空间浪费的内存更少。但是……我觉得这些论点站不住脚。让我们分别看一下它们:

  • 减少操作系统调度程序的工作。是的,但这是否意味着总工作量减少?仍然有 N 个任务并行运行,SOMEBODY 必须在它们之间切换。在我看来,我们只是从操作系统内核中获取了工作,并开始在我们自己的用户空间代码中进行。但是需要完成的工作量并没有因此而改变。那么效率从何而来?
  • 堆栈空间浪费的内存更少。或者是吗?
  • 首先,我不知道其他操作系统,但至少在 Windows 中,线程的堆栈空间不会一次全部提交。保留了虚拟内存地址,但仅在需要时才提交实际内存。
  • 即使它被提交了,也没什么大不了的,因为仅仅分配内存并不会减慢你的程序的速度。除非你用完它,否则现代计算机有足够的内存来容纳数千个堆栈,尤其是服务器。
  • 即使堆栈确实被提交并且 DO 最终导致内存不足,大多数堆栈在开始时也只会使用一点(如果您的程序正在调情堆栈溢出,您需要担心更大的问题)。这意味着无论如何都可以将其中的大部分分页。
  • 大内存使用的真正问题是 CPU 缓存被大量浪费。当您在需要的地方获得大量数据,而 CPU 缓存无法跟上所有数据时,需要一次又一次地从主 RAM 中获取数据——这就是事情变慢的时候。但是异步编程在这方面没有任何帮助。如果有的话,它会主动使用更多内存。我们现在有单独的 Task 而不是精益堆栈框架在堆上分配的对象本质上是为每个堆栈帧分配的,其中包含状态和局部变量以及回调引用和所有内容。此外,它在整个地址空间中都是碎片化的,这给 CPU 缓存带来了更多麻烦,因为预取将毫无用处。

  • 那么......我错过了房间里的哪头大象?

    最佳答案

    why is the general consensus that async is better performing than multithreading? (added: I'm talking about the case where either approach is viable and you get to make a choice)



    服务器端, async让您最大限度地利用线程。为什么一个线程可以处理数百个连接?在服务器端,这不是“异步与线程”场景——而是“异步与线程”场景。

    在客户端 - 任何一种方法都是真正可行的 - 它并不重要。那么如果你启动一个额外的不必要的线程怎么办?即使对于如今的移动应用程序而言,这也没什么大不了的。虽然从技术上讲, async可以帮助提高效率,尤其是在内存和电池受限的设备中,在历史的这个时刻,它并不是那么重要。然而,即使在客户端, async有一个巨大的好处,它允许您编写串行代码而不是与回调混在一起。

    There are still N tasks running in parallel, SOMEBODY has to switch between them.



    编号 async 使用的 I/O 任务不要在任何地方“运行”,也不需要“切换”到。在 Windows 上,I/O 任务在底层使用 IOCP,并且 I/O 任务不会“运行”——它们只是“完成”,这是系统中断的结果。更多信息在我的博文 "There Is No Thread" .

    Where then does the efficiency come from?



    “效率”这个词很棘手。例如,异步 HTTP 服务器处理程序实际上比同步处理程序响应更慢。使用回调等设置整个异步事物会产生开销。 然而,这种减速 AFAICT 小得无法衡量,并且异步代码允许该服务器处理比同步服务器更多的并发请求(在实际测试中,我们保守估计是 10 倍)。此外,异步代码不受线程池的线程注入(inject)率限制,因此异步服务器代码对负载的突然变化响应更快,与相同场景下的同步服务器相比,减少了请求超时的次数。同样,这是由于“异步和线程”,而不是“异步而不是线程”。

    几年前,Node.js 被誉为一个非常高效的服务器——基于现实世界的测量。当时,大多数 ASP.NET 应用程序都是同步的(在 async 之前编写异步应用程序非常困难,而且公司知道只为更多的服务器硬件付费更便宜)。 Node.js,其实只有 曾经运行您的应用程序的服务器线程。它是 100% 异步的,这就是它获得可扩展性优势的地方。 ASP.NET 注意到了这一点,并且 ASP.NET Core(以及其他更改)使其整个堆栈异步。

    关于multithreading - 为什么异步被认为比多线程性能更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42857135/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com