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 相关文章推荐
style、 currentStyle、 runtimeStyle区别分析
Aug 01 Javascript
jquery offset函数应用实例
Nov 14 Javascript
JavaSript中变量的作用域闭包的深入理解
May 12 Javascript
很全面的JavaScript常用功能汇总集合
Jan 22 Javascript
最棒的Angular2表格控件
Aug 10 Javascript
分分钟学会vue中vuex的应用(入门教程)
Sep 14 Javascript
小程序指纹验证的实现代码
Dec 04 Javascript
JavaScript实现星级评价效果
May 17 Javascript
CountUp.js数字滚动插件使用方法详解
Oct 17 Javascript
JS实现音乐钢琴特效
Jan 06 Javascript
jquery实现点击弹出对话框
Feb 08 jQuery
layui实现显示数据表格、搜索和修改功能示例
Jun 03 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
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
2017/08/17 PHP
获取Javscript执行函数名称的方法
2006/12/22 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
JS继承用法实例分析
2015/02/05 Javascript
基于jQuery创建鼠标悬停效果的方法
2015/03/07 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
Vue基础学习之项目整合及优化
2019/06/02 Javascript
vue中是怎样监听数组变化的
2020/10/24 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
Python中enumerate函数代码解析
2017/10/31 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
500行python代码实现飞机大战
2020/04/24 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
四风问题查摆材料
2014/08/25 职场文书
离婚被告代理词
2015/05/23 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL
千万级用户系统SQL调优实战分享
2022/03/03 MySQL