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的实现原理的模拟代码 -1 核心部分
Aug 01 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
Jul 10 Javascript
解析JavaScript中点号“.”的多义性
Dec 02 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
Mar 18 Javascript
Windows 系统下安装和部署Egret的开发环境
Jul 31 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
Dec 04 Javascript
深入探究node之Transform
Jul 20 Javascript
vue仿element实现分页器效果
Sep 13 Javascript
15分钟深入了解JS继承分类、原理与用法
Jan 19 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
Feb 28 Javascript
js实现图片3D轮播效果
Sep 21 Javascript
js实现弹窗效果
Aug 09 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/11/25 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
php 防止表单重复提交两种实现方法
2016/11/03 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
Laravel框架创建路由的方法详解
2019/09/04 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
深入理解JavaScript系列(48):对象创建模式(下篇)
2015/03/04 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
D3.js实现柱状图的方法详解
2016/09/21 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
JavaScript中的 new 命令
2019/05/22 Javascript
[10:18]2018DOTA2国际邀请赛寻真——找回自信的TNCPredator
2018/08/13 DOTA
使用Python处理BAM的方法
2018/09/28 Python
python实现名片管理系统
2018/11/29 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python 实现绘制整齐的表格
2019/11/18 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
从python读取sql的实例方法
2020/07/21 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
澳大利亚冲浪和时尚服装网上购物:SurfStitch
2017/07/29 全球购物
南京软件公司的.net程序员笔试题
2014/08/31 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
初一科学教学反思
2014/01/27 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
关于旅游的活动方案
2014/08/15 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
python基础之类属性和实例属性
2021/10/24 Python
python中redis包操作数据库的教程
2022/04/19 Python