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 相关文章推荐
代码生成器 document.write()
Apr 15 Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 Javascript
HTTP 304错误的详细讲解
Nov 13 Javascript
JS 去除Array中的null值示例代码
Nov 20 Javascript
BootStrap中的table实现数据填充与分页应用小结
May 26 Javascript
Bootstrap CSS布局之图像
Dec 17 Javascript
TypeScript学习之强制类型的转换
Dec 27 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
Jan 21 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
Dec 11 Javascript
Vue实现固定定位图标滑动隐藏效果
May 30 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
Mar 23 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
Jul 29 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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
Zend Framework前端控制器用法示例
2016/12/11 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
取得一定长度的内容,处理中文
2006/12/20 Javascript
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
javascript创建动态表单的方法
2015/07/25 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
浅谈jQuery hover(over, out)事件函数
2016/12/03 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
JS+CSS实现3D切割轮播图
2020/03/21 Javascript
Python中str.join()简单用法示例
2018/03/20 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
2019/01/10 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
浅谈pyqt5在QMainWindow中布局的问题
2019/06/21 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
python3获取url文件大小示例代码
2019/09/18 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
高级技校毕业生自荐信
2013/11/18 职场文书
抽奖活动主持词
2014/03/31 职场文书
工厂采购员岗位职责
2014/04/08 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
2014年教学管理工作总结
2014/12/02 职场文书
毕业生个人总结
2015/02/28 职场文书
张思德观后感
2015/06/09 职场文书
MySQL8.0的WITH查询详情
2021/08/30 MySQL
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android