`

[转] Node.js 的性能特点,简单易懂

 
阅读更多

Node.js现在非常活跃,相关生态社区已经超过Lua(基本上比较知名的功能都有nodejs模块实现)。

 

但是我们为何要使用Node.Js?相比传统的webserver服务模式,nodejs有什么优点优势?

 

Node.Js是基于javascript语言,建构在google V8 engine以及Linux上的一个非阻塞事件驱动IO框架。nodejs是单进程单线程,但是基于V8的强大驱动力,以及事件驱动模型,nodejs的 性能非常高,而且想达到多核或者多进程也不是很难(现在已经有大量的第三方module来实现这个功能)。

这里主要不是介绍nodejs具体应用代码,而是想介绍一下事件驱动编程。

 

在这篇文章(1)里面,Dan York介绍了两种典型的事件驱动实例。

 

第一个例子是关于医生看病。

在美国去看医生,需要填写大量表格,比如保险、个人信息之类,传统的基于线程的系统(thread-based system),接待员叫到你,你需要在前台填写完成这些表格,你站着填单,而接待员坐着看你填单。你让接待员没办法接待下一个客户,除非完成你的业务

想让这个系统能运行的快一些,只有多加几个接待员,人力成本需要增加不少。

基于事件的系统(event-based system)中,当你到窗口发现需要填写一些额外的表格而不仅仅是挂个号,接待员把表格和笔给你,告诉你可以找个座位填写,填完了以后再回去找他。你回去坐着填表,而接待员开始接待下一个客户。你没有阻塞接待员的服务

你填完表格,返回队伍中,等接待员接待完现在的客户,你把表格递给他。如果有什么问题或者需要填写额外的表格,他给你一份新的,然后重复这个过程。

这个系统已经非常高效了,几乎大部分医生都是这么做的。如果等待的人太多,可以加入额外的接待员进行服务,但是肯定要比基于线程模式的少得多。

 

第二个例子是快餐店点餐。

在基于线程的方式中(thread-based way)你到了柜台前,把你的点餐单给收银员或者给收银员直接点餐,然后等在那直到你要的食物准备好给你。收银员不能接待下一个人,除非你拿到食物离开。想接待更多的客户,容易!加更多的收银员!

当然,我们知道快餐店其实不是这样工作的。他们其实就是基于事件驱动方式,这样收银员更高效。只要你把点餐单给收银员,某个人已经开始准备你的食 物,而同时收银员在进行收款,当你付完钱,你就站在一边而收银员已经开始接待下一个客户。在一些餐馆,甚至会给你一个号码,如果你的食物准备好了,就呼叫 你的号码让你去柜台取。关键的一点是,你没有阻塞下一个客户的订餐请求。你订餐的食物做好的事件会导致某个人做某个动作(某个服务员喊你的订单号码,你听到你的号码被喊到去取食物),在编程领域,我们称这个为回调(callback function)。

 

Node.Js做了什么工作呢?

 

传统的web server多为基于线程模型。你启动Apache或者什么server,它开始等待接受连接。当收到一个连接,server保持连接连通直到页面或者什 么事务请求完成。如果他需要花几微妙时间去读取磁盘或者访问数据库,web server就阻塞了IO操作(这也被称之为阻塞式IO).想提高这样的web server的性能就只有启动更多的server实例。

 

相反的,Node.Js使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用 户。这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)

 

考虑下面这个过程:

1,你用浏览器访问nodejs服务器上的"/about.html"

2,nodejs服务器接收到你的请求,调用一个函数从磁盘上读取这个文件。

3,这段时间,nodejs webserver在服务后续的web请求。

4,当文件读取完毕,有一个回调函数被插入到nodejs的服务队列中。

5,nodejs webserver运行这个函数,实际上就是渲染(render)了about.html页面返回给你的浏览器。

 

好像就节省了几微秒时间,但是这很重要!特别是对于需要相应大量用户的web server。

 

这也就是为什么Node.Js这么热这么惹人关注。而且它还使用了一个非常通用的编程语言Javascript,也让开发者可以快速容易的编写高可扩展性服务器。

分享到:
评论

相关推荐

    the node beginner book- a comprehensive node.js tutorial

    Manuel Kiessling是这本书的作者,他以通俗易懂的语言向读者传授Node.js的编程思想和实际操作。这本书是通过Leanpub平台进行销售的,Leanpub使用轻量级的工具并允许多次迭代,以便作者能够获得读者反馈并根据反馈...

    node.js代码

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行开发,从而打破了JavaScript只能在浏览器端使用的局限。这个"node.js代码"压缩包中可能包含了各种实用的Node.js代码...

    基于 node.js 的校园交流平台的设计与实现(word文档)

    操作上,简单易懂的界面设计使得用户上手容易。 4. 概要设计 - 系统功能设计:包括用户注册登录、个人信息管理、论坛发帖回帖、资源上传下载、聊天室等功能。前端主要负责展示和交互,后台处理数据逻辑。 - 数据库...

    25-Node.js开发指南_nodejs_开发_

    Node.js是一款基于Chrome V8引擎的JavaScript运行环境,它以其异步非阻塞I/O和事件驱动的模型,为构建高性能网络应用提供了强大的支持。本指南由清华大学学长编撰,旨在为初学者提供一个清晰、易懂的Node.js学习路径...

    node.js 设计模式 英文版

    ### Node.js设计模式第二版概览 #### 一、书籍基本信息 - **书名**:《Node.js设计模式》第二版 - **作者**:Mario Casciaro 和 Luciano Mammino - **出版社**:Packt Publishing - **出版时间**:第二版于2016年7...

    Node.js-nodejsexpressmysql构建的项目

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行开发。Express是Node.js的一个轻量级Web应用框架,它简化了构建Web服务和API的过程。而MySQL则是一种广泛使用的开源...

    CoffeeScript Programming with jQuery, Rails, and Node.js.pdf 下载

    Node.js的非阻塞I/O模型和事件驱动架构非常适合构建高性能的网络应用,而CoffeeScript的语法糖可以使这一过程更加顺畅。例如,使用CoffeeScript编写Node.js模块和路由处理函数,可以显著提高开发效率。 ### 五、...

    nodejs视频教材-很通俗易懂的讲解

    - **非阻塞I/O模型**:Node.js采用异步I/O处理方式,这使得它非常适合构建高性能且可伸缩的网络应用。 - **单线程**:尽管Node.js本身是单线程的,但它能够高效地处理并发请求,这是因为其事件驱动机制。 - **丰富的...

    Node入门经典(Node up and running)

    Node.js是JavaScript语言的服务器端运行环境,它允许开发者使用JavaScript构建服务器端应用,这在之前一直是其他语言的领域。Node.js的出现,使前端开发者能够用熟悉的语言来开发整个Web应用,包括后端服务。在Node...

    Node.js-docsite是一款开源站点搭建工具依据其提供的功能能够快速搭建一个开源站点

    Node.js是建立在Chrome V8引擎上的JavaScript运行环境,允许开发者使用JavaScript进行服务器端编程。Node.js具有异步、事件驱动的特性,这使得它在处理高并发I/O操作时表现出色,特别适合用于构建高性能的网络应用,...

    node in action

    《Node.js实战》是一本备受推崇的Node.js入门书籍,对于初学者来说,它提供了全面且易懂的Node.js知识体系。Node.js是一款基于Chrome V8引擎的JavaScript运行环境,以其异步、非阻塞I/O和事件驱动的特性,为开发高...

    我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环

    这种方式简单易懂,但可能导致阻塞,特别是在处理I/O密集型任务时,会严重影响程序性能。例如: ```javascript console.log('Start'); for (let i = 0; i ; i++) {} console.log('End'); ``` 这里的循环是同步的,...

    nodejs初学者入门

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。这个文档的目标是帮助那些对Node.js和“高级”JavaScript不太熟悉的开发者快速上手,构建应用程序。内容不仅...

    Node.JS文件系统解析实例详解

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,让JavaScript能够在服务器端运行,并提供丰富的API用于处理各种任务,如文件系统操作。本文将对Node.js文件系统模块进行解析,讲解异步和同步操作文件的方法,...

    nodejs最好的入门资料

    其中,Node.js 作为一款基于 Chrome V8 引擎的 JavaScript 运行环境,在近年来备受开发者们的青睐。它允许开发者使用 JavaScript 开发服务器端的应用程序,并以其高性能、高并发处理能力著称。 #### 二、《Learning...

Global site tag (gtag.js) - Google Analytics