asynchronous - 为什么异步编程更快

标签 asynchronous language-agnostic

我一直听说使用异步编程模式会使我的代码运行得更快。为什么这是真的?无论是现在运行还是稍后运行,都不是必须以任何一种方式运行完全相同的代码吗?

最佳答案

它不是更快,它只是不浪费时间。

同步代码在等待 I/O 时停止处理。这意味着当您读取文件时,您不能运行任何其他代码。现在,如果在读取该文件时您无事可做,那么异步代码不会给您带来太多好处。

通常,您可以使用的额外 CPU 时间对服务器很有用。所以问题是为什么要进行异步编程而不是为每个客户端启动一个新线程?

事实证明,启动和拆除线程是昂贵的。早在 2000 年代初期,Web 服务器基准测试发现 tclhttpd 在提供静态图像文件方面优于 Apache。尽管事实上 tclhttpd 是用 tcl 编写的,而 Apache 是用 C 编写的,并且众所周知 tcl 比 C 慢 50 倍。Tcl 成功地与 Apache 保持了对抗,因为 tcl 有一个易于使用的异步 I/O API。于是tclhttpd就用上了。

并不是说 C 没有异步 I/O API。只是它们很少使用。所以Apache没有使用它。现在,Apache2 在内部使用异步 I/O 和线程池。 C 代码最终看起来更复杂,但速度更快 - 吸取了教训。

这导致我们最近对异步编程的痴迷。人们为什么对它着迷? (例如,关于 javascript 编程的 Stackoverflow 上的大多数答案都坚持认为您永远不应该使用异步函数的同步版本)。

这可以追溯到您很少在 C 中看到异步程序的原因,即使它是一种出色的处理方式(GUI 代码是一个异常(exception),因为 UI 库很早就学会了依赖异步编程和事件)。 C 中有太多同步的函数。因此,即使您想进行异步编程,您迟早也会调用同步函数。另一种选择是放弃 stdlib 并为所有内容编写自己的异步库 - 从文件 I/O 到网络再到 SQL。

因此,在像 javascript 这样的语言中,异步编程最终成为默认风格,其他程序员的压力是不要把它搞砸,并意外地引入同步函数,这些函数很难与异步代码集成而不会损失很多性能。所以最终,就像税收一样,异步代码变成了一种社会契约。

关于asynchronous - 为什么异步编程更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981941/

相关文章:

c# - 异步MySQL

javascript - .json()用于错误处理的内容是什么?

node.js redis同步解决方案

math - 相对于相机方向在 2D 中移动的计算是什么?

架构,大量方法 vs 长参数列表

python - 高尔夫代码: Finite-state machine!

c# - Controller 的非异步方法是否会阻止其他用户在使用或锁定时进入?

node.js - Node-amqp 和异步 ack

algorithm - Wa-Tor 就像元胞自动机。应该按什么顺序更新单元格?

language-agnostic - 是否存在允许您以不同缩进样式查看源代码的编辑器?