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 相关文章推荐
javascript实现面向对象类的功能书写技巧
Mar 07 Javascript
最佳JS代码编写的14条技巧
Jan 09 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
Jan 23 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
Feb 17 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
Aug 04 Javascript
JS中对数组元素进行增删改移的方法总结
Dec 15 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
详解vue slot插槽的使用方法
Jun 13 Javascript
JavaScript箭头函数_动力节点Java学院整理
Jun 28 Javascript
原生JS实现的简单小钟表功能示例
Aug 30 Javascript
JavaScript函数的4种调用方法实例分析
Mar 05 Javascript
javascript面向对象三大特征之继承实例详解
Jul 24 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防注入类实例
2014/12/05 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
php格式文件打开的四种方法
2018/02/24 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
25个非常棒的jQuery滑块插件和教程小结
2011/09/02 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
JS实现DIV容器赋值的方法
2015/12/14 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
jquery层级选择器(匹配父元素下的子元素实现代码)
2016/09/05 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
详解Python编程中基本的数学计算使用
2016/02/04 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
python 读取二进制 显示图片案例
2020/04/24 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
国际书籍零售商:Wordery
2017/11/01 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
Douglas意大利官网:购买香水和化妆品
2020/05/27 全球购物
保密工作整改报告
2014/11/06 职场文书
监考失职检讨书
2015/01/26 职场文书
教师个人年度总结
2015/02/11 职场文书
MySQL基础(二)
2021/04/05 MySQL
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python