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 ajax获取网站Alexa排名的代码
Dec 12 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
Apr 26 Javascript
jquery在IE、FF浏览器的差别详细探讨
Apr 28 Javascript
JS性能优化笔记搜索整理
Aug 21 Javascript
javascript实现2048游戏示例
May 04 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
详解JS几种变量交换方式以及性能分析对比
Nov 25 Javascript
Vue-router 切换组件页面时进入进出动画方法
Sep 01 Javascript
JS实现提示效果弹出及延迟隐藏的功能
Aug 26 Javascript
JS实现简单打字测试
Jun 24 Javascript
JavaScript实现矩形块大小任意缩放
Aug 25 Javascript
jQuery-App输入框实现实时搜索
Nov 19 jQuery
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
ThinkPHP模板之变量输出、自定义函数与判断语句用法
2014/11/01 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
深入解析PHP的Yii框架中的缓存功能
2016/03/29 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
浅谈PHP之ThinkPHP框架使用详解
2020/07/21 PHP
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
JQuery仿小米手机抢购页面倒计时效果
2014/12/16 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
javascript实现滚动效果的数字时钟实例
2016/07/21 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
详解微信小程序 通过控制CSS实现view隐藏与显示
2017/05/24 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
vue + node如何通过一个Txt文件批量生成MP3并压缩成Zip
2020/06/02 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
详解Python的迭代器、生成器以及相关的itertools包
2015/04/02 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
python实现动态创建类的方法分析
2019/06/25 Python
python scrapy重复执行实现代码详解
2019/12/28 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
python怎么自定义捕获错误
2020/06/29 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
学校安全生产月活动总结
2014/07/05 职场文书
党委书记个人检查对照材料思想汇报
2014/10/11 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
化验员岗位职责
2015/02/14 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
SQL之各种join小结详细讲解
2021/08/04 MySQL
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL