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实现的页内搜索代码
May 23 Javascript
Jquery replace 字符替换实现代码
Dec 02 Javascript
input按钮的事件处理大全
Dec 10 Javascript
纯Javascript实现Windows 8 Metro风格实现
Oct 15 Javascript
JS常用函数使用指南
Nov 23 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
Jun 08 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
纯js三维数组实现三级联动效果
Feb 07 Javascript
如何在JavaScript中优雅的提取循环内数据详解
Mar 04 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
Aug 29 Javascript
async/await让异步操作同步执行的方法详解
Nov 01 Javascript
Vue 中如何将函数作为 props 传递给组件的实现代码
May 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
无线电的诞生过程
2021/03/01 无线电
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
PHP中CURL方法curl_setopt()函数的参数分享
2013/01/19 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
PHP中抽象类和抽象方法概念与用法分析
2016/05/24 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
基于vue中keep-alive缓存问题的解决方法
2018/09/21 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
python使用正则表达式替换匹配成功的组
2017/11/17 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
python binascii 进制转换实例
2019/06/12 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
详解Python 循环嵌套
2020/07/09 Python
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
Everlast官网:拳击、综合格斗和健身相关的体育用品
2020/08/03 全球购物
成人毕业生自我鉴定
2013/10/18 职场文书
历史系毕业生自荐信
2013/10/28 职场文书
成考报名单位证明范本
2014/01/16 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
python requests模块的使用示例
2021/04/07 Python
Python干货实战之八音符酱小游戏全过程详解
2021/10/24 Python
分享几个简单MySQL优化小妙招
2022/03/31 MySQL