2015-05-01 57 views
3

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

+2

“如果你听每一只吠叫的狗,你将没有闲暇去学习智慧” –

回答

3

它并不总是更快。事实上,只需设置并拆除异步环境,就可以为代码添加大量时间。你必须分离出一个新的进程/线程,建立一个事件队列/消息泵,并最终清理所有的东西。 (即使您的框架隐藏了您的所有这些细节,它们也会在后台发生)。

优点是阻断。我们的代码很多取决于外部资源。我们需要在数据库中查询要处理的记录,或者从网站下载最新版本的东西。从你问这个资源的那一刻起,直到你得到一个答案,你的代码无事可做。它阻塞,等待答案。您的程序一直花费在屏蔽上的时间总共为

这就是async的设计目的。通过将“等待此阻止操作”代码转换为异步请求,您可让剩余的非阻塞代码继续运行。

作比喻,想象一个经理告诉他的员工那一天做什么。其中一项任务是打电话给等待时间很长的公司。如果他告诉她同步拨打电话,她会打电话和等待保留,而不做其他任何事情。使它异步,并且她可以在电话在后台保持时处理很多其他任务。

+0

我喜欢“搁置”类比 – lyjackal

0

它运行相同的代码,但它不会等待时间以任务完成。它将继续执行代码,直到异步函数完成。

6

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

同步代码在等待I/O时停止处理。这意味着当你阅读一个文件时,你不能运行任何其他代码。现在,如果在读取文件时没有别的事情要做,那么异步代码就不会为您购买任何东西。

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

事实证明,启动和拆除线程非常昂贵。在21世纪初的一段时间,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代码是一个例外,因为UI库很早就学会依赖于异步编程和事件)。 C中有太多的函数是同步的。所以,即使你想做异步编程,你最终还是会迟早调用一个同步函数。另一种方法是放弃stdlib并为所有内容编写自己的异步库 - 从文件I/O到网络到SQL。

因此,在像javascript这样的语言中,异步编程最终成为默认样式,其他程序员的压力不会让它乱成一团,并且意外地引入了同步函数,这将很难与异步代码集成而不会失去很多性能。所以最后,像税收一样,异步代码已经成为一种社会契约。