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.timer插件实现一个计时器
Apr 25 Javascript
jquery中动态效果小结
Dec 16 Javascript
Jquery下:nth-child(an+b)的使用注意
May 28 Javascript
JS字符串处理实例代码
Aug 05 Javascript
用svg制作富有动态的tooltip
Jul 17 Javascript
BootStrap智能表单实战系列(十一)级联下拉的支持
Jun 13 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 Javascript
浅析node应用的timing-attack安全漏洞
Feb 28 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
Sep 18 Javascript
在Vue中实现随hash改变响应菜单高亮
Mar 09 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
Mar 01 Javascript
交互式可视化js库gojs使用介绍及技巧
Feb 18 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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
支持oicq头像的留言簿(二)
2006/10/09 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
详谈PHP编码转换问题
2015/07/28 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
Symfony生成二维码的方法
2016/02/04 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
js展开闭合效果演示代码
2013/07/24 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
解决vue打包后vendor.js文件过大问题
2019/07/03 Javascript
详解nginx配置vue h5 history去除#号
2020/11/09 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
Python生成器(Generator)详解
2015/04/13 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
详解python中的Turtle函数库
2018/11/19 Python
Python中内建模块collections如何使用
2020/05/27 Python
Python 找出英文单词列表(list)中最长单词链
2020/12/14 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
化学实验员岗位职责
2013/12/28 职场文书
电厂厂长岗位职责
2014/01/02 职场文书
财务出纳岗位职责
2014/02/03 职场文书
企业军训感言
2014/02/08 职场文书
劲霸男装广告词
2014/03/21 职场文书
公开承诺书格式
2014/05/21 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书