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 last-child 列表最后一项的样式
Jan 22 Javascript
js封装的textarea操作方法集合(兼容很好)
Nov 16 Javascript
jQuery控制图片的hover效果(smartRollover.js)
Mar 18 Javascript
jQuery实现长文字部分显示代码
May 13 Javascript
解析window.open的使用方法总结
Jun 19 Javascript
Js与下拉列表处理问题解决
Feb 13 Javascript
JavaScript中的small()方法使用详解
Jun 08 Javascript
详解Angular开发中的登陆与身份验证
Jul 27 Javascript
js滚轮事件兼容性问题需要注意哪些
Nov 15 Javascript
BootStrap的两种模态框方式
May 10 Javascript
angularjs手动识别字符串中的换行符方法
Oct 02 Javascript
微信小程序自定义头部导航栏和导航栏背景图片 navigationStyle问题
Jul 26 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
我的论坛源代码(一)
2006/10/09 PHP
php str_pad 函数使用详解
2009/01/13 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
Javascript中常见的校验如域名、手机、邮箱等等
2014/01/02 Javascript
JavaScript检测字符串中是否含有html标签实现方法
2015/07/01 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
原生JS实现小小的音乐播放器
2017/10/16 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
Python中使用PIPE操作Linux管道
2015/02/04 Python
Python基于csv模块实现读取与写入csv数据的方法
2018/01/18 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
25道Java面试题集合
2013/05/21 面试题
资料员的岗位职责
2013/11/20 职场文书
最热门的自我评价
2013/12/30 职场文书
咖啡蛋糕店创业计划书
2014/01/28 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
五好家庭事迹材料
2014/12/20 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
MySQL 聚合函数排序
2021/07/16 MySQL