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 相关文章推荐
JS实现可改变列宽的table实例
Jul 02 Javascript
jQuery中filter()和find()的区别深入了解
Sep 25 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
Jun 25 Javascript
JavaScript实现左右下拉框动态增删示例
Mar 09 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
Apr 01 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
Aug 16 Javascript
浅谈VUE监听窗口变化事件的问题
Feb 24 Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
Aug 19 Javascript
通过图带你深入了解vue的响应式原理
Jun 21 Javascript
scrapyd schedule.json setting 传入多个值问题
Aug 07 Javascript
使用p5.js临摹动态图形
Oct 23 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
延长phpmyadmin登录时间的方法
2011/02/06 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
ajax异步刷新实现更新数据库
2012/12/03 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
动态加载jquery库的方法
2014/02/12 Javascript
JavaScript中实现单体模式分享
2015/01/29 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
网页挂马方式整理及详细介绍
2016/11/03 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
JS实现电商商品展示放大镜特效
2020/01/07 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
[50:54]完美世界DOTA2联赛 GXR vs IO 第三场 11.07
2020/11/10 DOTA
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
Viking Direct荷兰:购买办公用品
2019/06/20 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
致标枪运动员广播稿
2014/02/06 职场文书
优秀班组事迹材料
2014/12/24 职场文书
党支部承诺书
2015/01/20 职场文书
大学推普周活动总结
2015/05/07 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
php字符串倒叙
2021/04/01 PHP
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB
Golang解析JSON对象
2022/04/30 Golang