Node.js 的异步 IO 性能探讨


Posted in Javascript onOctober 08, 2014

Python 和 Ruby 也有这样的框架,但因为在实际使用中会不可避免地用到含有同步代码的库,因此没能成长起来,而在 Node.js 之前,JavaScript 的服务器端编程几乎是空白,所以 Node.js 才得以建立起了一个所有 IO 均为异步的代码库。

大部分 Web 应用的瓶颈都在 IO, 即读写磁盘,读写网络,读写数据库。使用怎样的策略等待这段时间,就成了改善性能的关键点。

PHP 的策略:多进程运行,直接原地等待 IO 完成。缺点:多个进程会消耗多份内存,进程间难以共享数据。
C/C++ 通常的策略:多线程运行,程序自己维护锁的状态。缺点:开发成本高,容易出错,不易调试。
Python(Tornado): 多个请求在单个进程中轮流执行,遇到 IO 时切换到另一个请求。缺点:对于单个请求而言,依然没有最高效地利用时间。
何谓「最高效地利用时间」?比如现在有两个不相关的数据库查询,在 PHP 中通常会先执行一个,执行完成后再执行第二个(总时间是 a + b). 显然这不是最高效的,应该同时执行两个查询,时间是 max(a, b).

Python 和其他支持多线程的语言的问题就在于,在语言层面,程序员很难告诉虚拟机,应当将两个操作同时执行,即使有办法,也相当麻烦,大多数人懒得去用(也不值得去用)。而因为 Node.js 丧心病狂地强制所有 IO 异步执行,Node.js 的程序员也可以说是轻车熟路,配合一些改善代码可读性库(promise, async), 可以很轻松地让不相干的操作并行执行。

上面讲了异步 IO 的实现,那么异步 IO 的优势究竟体现在哪里呢。实际上异步 IO 并不能神奇地减轻服务器的压力,该加服务器还是一样要加服务器,只不过异步 IO 会减少单个请求的时间,去掉单个请求中那些无意义的等待时间。所以单位时间内处理的请求没有变化,但每个请求的处理时间却减少了。从这个角度,服务器也节约了一些资源——即维持每个请求的连接消耗的内存。

Javascript 相关文章推荐
基于Jquery easyui 选中特定的tab
Nov 17 Javascript
jquery简单倒计时实现方法
Dec 18 Javascript
JavaScript动态创建div等元素实例讲解
Jan 06 Javascript
jstree的简单实例
Dec 01 Javascript
关于微信上网页图片点击全屏放大效果
Dec 19 Javascript
jQuery实现为动态添加的元素绑定事件实例分析
Sep 07 jQuery
vue根据进入的路由进行原路返回的方法
Sep 26 Javascript
详解vue更改头像功能实现
Apr 28 Javascript
微信小程序实现卡片左右滑动效果的示例代码
May 01 Javascript
如何换个角度使用VUE过滤器详解
Sep 11 Javascript
python实现迭代法求方程组的根过程解析
Nov 25 Javascript
JavaScript仿京东秒杀倒计时
Mar 17 Javascript
JS中的form.submit()不能提交表单的错误原因
Oct 08 #Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
Oct 07 #Javascript
js交换排序 冒泡排序算法(Javascript版)
Oct 04 #Javascript
Javascript获取当前时间函数和时间操作小结
Oct 01 #Javascript
js事件绑定快捷键以ctrl+k为例
Sep 30 #Javascript
显示今天的日期js代码(阳历和农历)
Sep 30 #Javascript
gridview生成时如何去掉style属性中的border-collapse
Sep 30 #Javascript
You might like
咖啡语言
2021/03/03 咖啡文化
精通php的十大要点(上)
2009/02/04 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
关于取不到由location.href提交而来的上级页面地址的解决办法
2009/07/30 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
alert中断settimeout计时功能
2013/07/26 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
详解有关easyUI的拖动操作中droppable,draggable用法例子
2017/06/03 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
vue-cli中使用高德地图的方法示例
2019/03/28 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
Element的el-tree控件后台数据结构的生成以及方法的抽取
2020/03/05 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python中datetime模块参考手册
2017/01/13 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
python3使用腾讯企业邮箱发送邮件的实例
2019/06/28 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
python 经典数字滤波实例
2019/12/16 Python
Python API len函数操作过程解析
2020/03/05 Python
python源文件的字符编码知识点详解
2021/03/04 Python
波兰在线运动商店:YesSport
2020/07/23 全球购物
婚前协议书范本
2014/10/27 职场文书
2014年营销工作总结
2014/11/22 职场文书
一年级语文下册复习计划
2015/01/17 职场文书
Python 视频画质增强
2022/04/28 Python
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL