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 判断页面元素是否存在的代码
Aug 14 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
Dec 12 Javascript
使用jquery实现简单的ajax
Jul 08 Javascript
JS实现表格数据各种搜索功能的方法
Mar 03 Javascript
AngularJS基础 ng-value 指令简单示例
Aug 03 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
Sep 17 Javascript
微信小程序 form组件详解及简单实例
Jan 10 Javascript
原生JS+Canvas实现五子棋游戏
May 28 Javascript
详解Vue中使用Echarts的两种方式
Jul 03 Javascript
JavaScript基础之静态方法和实例方法分析
Dec 26 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 09 Javascript
JavaScript实现简易计算器小功能
Oct 22 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
JQuery 入门实例1
2009/06/25 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
javascript常用函数(2)
2015/11/05 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
layui 实现加载动画以及非真实加载进度的方法
2019/09/23 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
vue-router路由懒加载及实现的3种方式
2021/02/28 Vue.js
python list转dict示例分享
2014/01/28 Python
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
python多线程高级锁condition简单用法示例
2019/11/07 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
百年校庆节目主持词
2014/03/27 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
2015年世界环境日活动方案
2015/05/05 职场文书
MySQL表的增删改查(基础)
2021/04/05 MySQL
Python机器学习之KNN近邻算法
2021/05/14 Python