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 相关文章推荐
SWFObject Flash js调用类
Jul 08 Javascript
jquery获取自定义属性(attr和prop)实例介绍
Apr 21 Javascript
使用jquery实现以post打开新窗口
Mar 19 Javascript
jQuery scrollFix滚动定位插件
Apr 01 Javascript
jQuery simpleModal插件的使用介绍
Aug 30 Javascript
JS 实现随机验证码功能
Feb 15 Javascript
Node.js使用Express创建Web项目详细教程
Mar 31 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
Jun 01 Javascript
React中的refs的使用教程
Feb 13 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
Apr 10 Javascript
小程序和web画三角形实现解析
Sep 02 Javascript
vue 查看dist文件里的结构(多种方式)
Jan 17 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调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
php计算十二星座的函数代码
2012/08/21 PHP
初识javascript 文档碎片
2010/07/13 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
js淡入淡出焦点图幻灯片效果代码分享
2015/09/08 Javascript
浅谈js基本数据类型和typeof
2016/08/09 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
jQuery获取Table某列的值(推荐)
2017/03/03 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
Python中捕捉详细异常信息的代码示例
2014/09/18 Python
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
python eventlet绿化和patch原理
2020/11/21 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
解释一下Windows的消息机制
2014/01/30 面试题
文秘专业应届生求职信范文
2013/11/14 职场文书
党员十八大心得体会
2014/09/12 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS