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 typeof 用法
Dec 28 Javascript
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
javascript中创建对象的几种方法总结
Nov 01 Javascript
jquery遍历checkbox的注意事项说明
Feb 21 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
JavaScript 隐性类型转换步骤浅析
Mar 15 Javascript
JS获取url参数,JS发送json格式的POST请求方法
Mar 29 Javascript
Vue 样式绑定的实现方法
Jan 15 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
Aug 26 Javascript
node.js实现简单的压缩/解压缩功能示例
Nov 05 Javascript
vscode+gulp轻松开发小程序的完整步骤
Oct 18 Javascript
解决vue项目运行npm run serve报错的问题
Oct 26 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.MVC的模板标签系统(二)
2006/09/05 PHP
一个查看session内容的函数
2006/10/09 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
2018/09/16 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
javascript getElementsByName()的用法说明
2009/07/31 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
JavaScript动态插入script的基本思路及实现函数
2013/11/11 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
详解AngularJS如何实现跨域请求
2016/08/22 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
Python基础语言学习笔记总结(精华)
2017/11/14 Python
python下10个简单实例代码
2017/11/15 Python
用python实现刷点击率的示例代码
2019/02/21 Python
python os模块简单应用示例
2019/05/23 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
优秀毕业自我鉴定
2014/02/15 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
规范化管理年活动总结
2014/08/29 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
初中家长评语和期望
2014/12/26 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers