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 相关文章推荐
获取当前网页document.url location.href区别总结
May 10 Javascript
jquery里的正则表达式说明
Aug 03 Javascript
跨浏览器的事件对象介绍
Jun 27 Javascript
jquery动态加载js/css文件方法(自写小函数)
Oct 11 Javascript
使用js实现数据格式化
Dec 03 Javascript
js实现无缝滚动图
Feb 22 Javascript
ES6中Generator与异步操作实例分析
Mar 31 Javascript
十分钟带你快速了解React16新特性
Nov 10 Javascript
使用svg实现动态时钟效果
Jul 17 Javascript
javascript中的this作用域详解
Jul 15 Javascript
vue-iview动态新增和删除的方法
Jun 17 Javascript
vue实现简单计算商品价格
Sep 14 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&mysql(二)
2006/10/09 PHP
基于PHP开发中的安全防范知识详解
2013/06/06 PHP
如何使用PHP对网站验证码进行破解
2015/09/17 PHP
php实现网站留言板功能
2015/11/04 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
laravel实现按时间日期进行分组统计方法示例
2019/03/23 PHP
如何使用jQUery获取选中radio对应的值(一句代码)
2013/06/03 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
JS动态添加Table的TR,TD实现方法
2015/01/28 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
2018/08/16 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
详解微信图片防盗链“此图片来自微信公众平台 未经允许不得引用”的解决方案
2019/04/04 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python简明入门教程
2015/08/04 Python
详解Python的三种可变参数
2019/05/08 Python
python爬虫基础之urllib的使用
2020/12/31 Python
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
师范生实习个人的自我评价
2013/09/28 职场文书
舞蹈比赛获奖感言
2014/02/04 职场文书
汽车促销活动方案
2014/03/31 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
党校党性分析材料
2014/12/19 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
React forwardRef的使用方法及注意点
2021/06/13 Javascript