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 相关文章推荐
JavaScript 对象模型 执行模型
Oct 15 Javascript
JavaScript学习点滴 call、apply的区别
Oct 22 Javascript
JQUBar 基于JQUERY的柱状图插件
Nov 23 Javascript
js中将HTMLCollection/NodeList/伪数组转换成数组的代码
Jul 31 Javascript
js function定义函数的几种不错方法
Feb 27 Javascript
javascript中局部变量和全局变量的区别详解
Feb 27 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
Nov 18 Javascript
js仿百度音乐全选操作
Jan 13 Javascript
Vue.js实现数据响应的方法
Aug 13 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 Javascript
es6 for循环中let和var区别详解
Jan 12 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
德劲1103二次变频版的打磨
2021/03/02 无线电
php中变量及部分适用方法
2008/03/27 PHP
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
PHP无敌近乎加密方式!
2010/07/17 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
PHP defined()函数的使用图文详解
2019/07/20 PHP
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
javascript使用正则表达式检测IP地址
2014/12/03 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
jQuery中的each()详细介绍(推荐)
2016/05/25 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
修改 bootstrap table 默认detailRow样式的实例代码
2017/07/21 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
python pdb调试方法分享
2014/01/21 Python
使用Django的模版来配合字符串翻译工作
2015/07/27 Python
Python中类的初始化特殊方法
2017/12/01 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
Django app配置多个数据库代码实例
2019/12/17 Python
Python urllib2运行过程原理解析
2020/06/04 Python
法国在线药房:1001Pharmacies
2021/03/07 全球购物
Final类有什么特点
2012/04/25 面试题
PyQt 如何创建自定义QWidget
2021/03/24 Python
医院合作意向书范本
2015/05/08 职场文书
2016年优秀班主任先进事迹材料
2016/02/26 职场文书
Django框架中表单的用法
2022/06/10 Python