精华内容
参与话题
问答
  • 现在 Node.js 官网的定义就这么简单,但也可以看出几个最重要的特征 Node.js 不是一门语言,是一个运行时,和浏览器更像,只不过运行在服务端 这个运行时的方言是 JavaScript(不包含 BOM、DOM API,增加了 Stream、...

    现在 Node.js 官网的定义就这么简单,但也可以看出几个最重要的特征

    Node.js 不是一门语言,是一个运行时,和浏览器更像,只不过运行在服务端
    这个运行时的方言是 JavaScript(不包含 BOM、DOM API,增加了 Stream、网络等 API)
    Node.js 是靠 Chrome V8 引擎运行 JavaScript
    

    对应到 Java 我们可以理解 Node.js 是 JDK,装上就能在服务端跑 JavaScript 代码了。

    Chrome 和 Node.js 同样是 JavaScript 运行时,都使用了 V8 引擎,主要区别在于 V8 只实现了 ECMAScript 的数据类型、对象和方法,Chrome 运行时提供了 Window、DOM、BOM,而 Node.js 运行时提供了global、 Buffer、net 等模块

    下面内容需要一些计算机基础知识,但看不懂并不影响 Node.js 的学习
    

    事件驱动 & 非阻塞 I/O 是什么

    在 Node.js 才诞生的时候大家总是充满了好奇,早期官网上的介绍要更多一些,主要说了 Node 最核心的两个特性:事件驱动、非阻塞 I/O

    Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.
    

    举个例子理解 Node.js 和之前大部分 web 应用编程区别,当读取数据库的时候会写出这样的代码

    var result = db.query(‘select * from…’);

    I/O 是一个相对耗时较长的工作(这是后面讨论的前提),I/O 任务主要由 CPU 分发给 DMA 执行,等待数据库查询结果的时候进程在做什么?大部分时候就是单纯在等着而已

    不同硬件设备 I/O 操作所花费 CPU cycles

    Action Cost (CPU cycles)
    L1 Cache* 3
    L2 Cache* 14
    RAM* 250
    Disk 41,000,000
    Network 240,000,000

    这明显是在浪费 CPU,所以有了多线程的性能优化手段,但学习操作系统的时候我们就知道

    操作系统创建线程和切换多和线程上下文需要一定的开销
    因为多线程带来的执行堆栈是要占用内存的
    多线程变成面对的死锁、状态同步等问题会增加使用的复杂性
    

    上面的代码要么阻塞整个进程,要么使用了多线程,如果进程不等待 I/O 结果,直接处理后续任务就是非阻塞 I/O,这样可以不用浪费 CPU

    db.query(‘select * from…’, function (result) {
    // 消费 result
    });

    在 Promise、async|await 没有的年代,回调是异步的通用处理方式
    

    http://www.hnaguo.com
    进程如何获知异步 I/O 调用完成,触发回调函数呢?这就要靠 Event Loop 实现,也就是上面提到的事件驱动
    image.png

    这个图看起来非常复杂,有几个要点可以帮助理解

    在 Node.js 中所有操作称之为事件,客户端的请求也是事件,所有事件维护在图中最左侧的事件队列中
    Node.js 主线程也就是图中间的循环就是 Event Loop,主要作用是轮训事件队列中是否存在事件
        有非阻塞事件,按照先进先出原则依次调用处理
        有阻塞事件,交给图中最右侧的 C++ 线程池处理,线程池处理完成后把结果通过 Event Loop 返回给事件队列
        进行下一次循环
    一个请求所有事件都被处理,把响应结果发给客户端,完成一次请求
    

    这样一个请求 - 响应模型就完成了,如果在 Event Loop 中包含同步的 CPU 密集操作,就会阻塞主线程
    Node.js 性能真的高吗?

    要回答这个问题首先需要了解几个基本常识

    CPU 运算远远快于 I/O 操作
    Web 是典型的 I/O 密集场景
    JavaScript 是单线程,但 JavaScript 的 runtime Node.js 并不是,负责 Event Loop 的 libuv 用 C 和 C++ 编写
    

    很多语言是依赖的多线程解决高并发,一个线程处理一条用户请求,处理完成了释放线程,在阻塞 I/O 模型下, I/O 期间该用户线程所占用的 CPU 资源(虽然十分微量,大部分交给了 DMA)什么都不做,等待 I/O,然后响应用户,而且开启多个进程/线程 CPU 切换 Context 的时间也十分可观

    就像饭店的服务员只负责点菜,如果给每个厨师都配一个服务员,服务员把客人菜单给大厨后就玩手机等着一样,你是老板你也生气,况且不同于饭店大厨工资高于服务员,在计算机世界,CPU 资源比 I/O 宝贵的多

    说 Node.js 在高并发、I/O 密集场景性能高,也就是 Web 场景性能高主要也是解决这个问题,没必要一个厨师配一个服务员,整个饭店说不定一个服务员就够了,剩下的钱可以随便做其它事情

    用户请求来了, CPU 的部分做完不用等待 I/O,交给底层完成,然后可以接着处理下一个请求了,快就快在

    非阻塞 I/O
    Web 场景 I/O 密集
    没多线程 Context 切换开销,多出来的开销是维护 EventLoop
    

    http://www.zhuzhuhn.com
    其它场景 NodeJS 性能确实不高,甚至非常低下,感兴趣可以看一下 Apache(多进程) 和 Nginx(事件驱动) 对比,现在大型 web 应用普遍是 Nginx 在最前面做负载均衡服务器、静态资源服务器,Apache 在下一层做实际 Web Server,响应动态请求

    因此 Node.js 在 I/O 密集的 Web 场景相对于使用多进程模型语言有性能优势,这个优势不是来源于语言,而是操作系统实现,Java 按照这种模型实现性能一样很高

    展开全文
  • 同一套业务逻辑,实现一个webservice中间接口,中间涉及memcached和...得到的测试结果很是出乎意料,Node.js的高并发优势什么没有体现出来呢??? 操作系统:CentOS 6.4(虚拟机)内存:1.5GCPU:单核 并发数 ...

     

    同一套业务逻辑,实现一个webservice中间接口,中间涉及memcached和mogodb的一些操作。
    分别在Node.js和JAVA平台实现,java代码部署在Tomcat 7.0上,用Apache jmeter进行压力测试。
    得到的测试结果很是出乎意料,Node.js的高并发优势为什么没有体现出来呢???

    操作系统:CentOS 6.4(虚拟机)
    内存:1.5G
    CPU:单核

    并发数 100
    执行次数 10

    以下是测试结果

    可以看到Node.js的平均执行时间为333毫秒,Tomcat的执行时间为48毫秒,Tomcat比Node.js快了近7倍!

    补充:即使是测试接口直接返回,不涉及后续的操作,Tomcat也比Node.js快了N倍,有没有做过相关测试的给个解释。

    转载于:https://www.cnblogs.com/ever4ever/p/3853022.html

    展开全文
  • 刚才无聊,看了下知乎上关于node.js优势/劣势的帖子。 帖子地址见: http://www.zhihu.com/question/19653241 从大概28个回答中看: 优势主要: 性能优势 前后端统一 语言 统一的模型(事件驱动/异步) 社区很...

    声明:

    本博客欢迎转发,但请保留原作者信息!

    博客地址:http://blog.csdn.net/halcyonbaby

    内容系本人学习、研究和总结,如有雷同,实属荣幸!


    刚才无聊,看了下知乎上关于node.js优势/劣势的帖子。

    帖子地址见:

    http://www.zhihu.com/question/19653241


    从大概28个回答中看:

    优势主要有:

    性能优势

    前后端统一 语言

    统一的模型(事件驱动/异步)

    社区很活跃

    入门简单 开发效率高


    劣势主要有:

    不好debug

    容易写出糟糕的代码

    有些包不稳定

    单线程(貌似0.8已经不存在这个缺点了)


    适用场景主要有:

    适合高并发高IO(如web game?抢购?),不适合复杂计算的场合(如视频编码)


    使用公司主要有:

    LinkedIn   Yahhoo 阿里巴巴  ebay microsoft 小米........

    展开全文
  • Node.js入门-Node.js 介绍

    2014-04-26 19:49:00
    Node.js什么 Node.js 不是一种独立的语言,与 PHP,Python 等”既是语言优势平台“不同,它也不是一个 JavaScrip 框架,不同于 CakePHP,Django,更不是一个 JavaScript 库,不能和 jQuery 相提并论。总的来说,...

    Node.js 是什么

    Node.js 不是一种独立的语言,与 PHP,Python 等”既是语言优势平台“不同,它也不是一个 JavaScrip 框架,不同于 CakePHP,Django,更不是一个 JavaScript 库,不能和 jQuery 相提并论。总的来说,Node.js 是一个让 JavaScript 运行在服务端的开发平台。

    Node.js 是一个让 JavaScript 运行在浏览器之外的平台。它实现了注入文件系统、模块、包、操作系统级别的API、网络通信等JavaScript不能做到或者做得不好的功能

    Node.js 能做什么

    使用 Node.js 可以轻松的开发:

    • 具有复杂逻辑的网站
    • 大规模的 Web 应用
    • Web Socket 服务器 wiki
    • TCP/UDP 套接字应用程序
    • 命令行工具
    • 交互式终端程序
    • 本地应用程序
    • 单元测试工具
    • 客户端JavaScript编译器

    Node.js 可以作为服务器提供服务,他跳过了类似 Apache,IIS 等 HTTP 服务器,内建了 HTTP 服务器支持,无需额外搭建一个 HTTP 服务器,便可以轻而易举地实现网站和服务器的组合。

    var http=require("http");
    http.createServer(function(req,res){
        res.writeHead(200,{"Content-Type":"text/plain"});
        res.end("Hello,CrispElite!\n");
    }).listen(3000,"127.0.0.1");//
    console.log("服务器已启动:http://127.0.0.14:3000/");

    将代码保存为 server.js ,从终端或者CMD中运行这个程序:

    node server.js // 必须先安装好Node.js环境

    如果成功启动服务器,那么在终端或者CMD中可以看到类似这样的显示:

    你的服务器已启动:http://127.0.0.14:3000/

    用浏览器访问"http://127.0.0.14:3000/" (代码中 listen() 指定的地址)
    Node server

    Node.js 还可以部署到非网络应用的环境下,比如命令行。甚至可以调用 C/C++ 的代码,充分利用已经拥有的诸多函数库。

    异步式 I/O 与事件驱动

    Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计。对于高并发的解决方案,传统的架构师多线程模型,也就是为每一个业务逻辑提供一个系统线程,通过切换线程弥补同步式 I/O 的事件开销。Node.js 和 JavaScript 一样使用的是单线程模型,对于所有的 I/O 请求都采用异步的方式,在执行过程中维护一个且只有一个事件队列,程序在执行时进入时间循环等待下一个事件到来,每一个异步 I/O 请求完成之后都被添加到事件队列,等待处理。

    什么是阻塞( block )?线程在执行中如果遇到磁盘读写或者网络通信( 统称为 I/O 操作 ),通常要耗费较长时间,这是才做系统会剥夺这个线程的 CPU 控制权,使其暂停执行,并将资源让给其他的工作线程,这种线程调度方法称为阻塞。当 I/O 操作完毕时,系统将这个线程的阻塞状态解除,恢复其对 CPU 的控制权,令其继续执行。这种 I/O 模式就是通常的同步式 I/O ( Synchronous I/O )或者阻塞式 I/O ( Blocking I/O )

    比如:你去超市买东西,结账的柜台只有一个,但是排队结账的人很多。而你只能排队结账。,可是每天排队的人很多,慢慢的大家开始抱怨每天买点东西搞得像过年过节一样。超市老板为了满足顾客,斥资招人,多开几个结账柜台。这样一来,虽然还要排队,但是队伍多了,每个队伍的等待时间少了。

    异步式 I/O ( Asynchronous I/O ) 或者非阻塞式 I/O ( Non-blocking I/O ) 则针对所有 I/O 操作不采用阻塞的策略。当线程遇到 I/O 操作时,只将 I/O 请求发送给操作系统,继续执行下一条语句。当操作系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个事件。

    比如:你还是去超市买东西,但是你要的东西超市采购的货还在路上,于是到柜台咨询。客服要求你留下联系方式,货到之后联系你。过了几天,超市工作人员打电话给你,告诉你你要的货到了。然后你屁颠屁颠跑去超市拿货。

    阻塞模式下,一个线程只能处理一项任务,想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行计算操作, I/O 以事件的方式通知。多线程带来的好处仅仅是在多核 CPU 的情况下利用更多核,而 Node.js 的单线程也能带来同样的好处。这就是为什么 Node.js 使用了单线程,非阻塞的事件编程模式。

    单线程事件驱动的异步I/O 比传统的多线程阻塞式 I/O 的好处在于:异步式 I/O 少了了多线程的开销。具体细节请看link

    比如:简单的数据库查询操作,按照传统的方式实现的代码如下:

    res=db.query("SELECT * from someTable");
    res.output();

    执行到第一行的时候,线程会阻塞,直到数据库返回查询结果。然后再继续处理。当涉及到磁盘读写,网络通信时,时延可能非常大,线程会阻塞等待结果返回。对于高并发的访问,一方面线程长期阻塞等待,另一方面为了应付新的请求而不断增加线程,因此浪费大量系统资源。而对于 Node.js 来说,是这样的

    db.query("SELECT * from someTable",function(res){
        res.output();
    });

    进程在执行到 db.query 时,不会等待结果返回,而是直接继续执行后面的语句,直到进入事件循环。

    Node.js 的模块( Module )和包( Package )

    模块( Module )和包( Package )是 Node.js 最重要的支柱。通过 npm 安装需要的模块,使用 require 函数来调用其他模块。
    npm 是 Node.js 的包管理器。允许我们下载、安装、升级、删除包。npm 之于 Node.js ,就像 pip 之于 Python,gem 之于 Ruby。
    安装好 npm 之后,可以从终端或者CMD开始安装模块。

    npm install [module_name]

    模块安装成功后,会被放置在当前目录的 node_modules 文件夹中。在使用 npm 安装包的时候,有两种模式:本地模式全局模式。默认情况下使用 npm install 命令就是本地模式,将包安装到当前目录的 node_modules 子文件夹中。另外一种被称为全局模式:npm install -g [modules_name] 。本地模式仅仅将包安装到 node_modules 文件夹中,并不会注册 PATH 环境变量,即无法在命令行中直接使用,在 window 上 会提示“不是内部命令”之类的。而使用全局模式的时候,包会安装在系统目录中,在 window 中会安装到 "C:\Users\yourUserName" 中,同时可以在命令行中直接使用命令。但是使用全局模式安装的包并不能直接在 JavaScript 文件中使用 require 获得。

    总而言之,当需要将某个包作为工程运作时的一部分时,通过本地模式获取,如果要在命令行中使用,则使用全局安装。

    关于调试

    我爱F5

    在开发 Node.js 实现的 HTTP 应用时,无论修改了代码的哪一部分,都必须重新运行才能奏效。因为 Node.js 只有在第一次引用到某部分时才会解析脚本文件,之后都会直接访问内存,避免重复载入,以提高速度。 supervisor 可以监视代码的修改,并自动重启Node.js。使用 npm 以全局模式安装 supervisor 之后,可以直接在命令行中使用下面的命令启动 server.js。

    supervisor server.js 

    调试方法

    调试的方法有:命令行调试,使用 Eclipse 调试等。个人倾向使用 node-inspector 进行调试。

    使用 node-inspector

    npm install -g node-inspector //命令安装 node-inspector 

    然后在终端或者CMD中敲入

    node --debug-brk=5858 filename.js  //连接你要测试的脚本的调试服务器
    node-inspector                  //另开一个窗口,启动 node-inspector 。

    在浏览器中打开 “http://127.0.0.1:3000/debug?port=5858” ,便可以看到调试工具。
    具体可以点这里

    个人笔记,仅供参考

    参考:

    转载于:https://www.cnblogs.com/zhanglun/p/3691971.html

    展开全文
  • 专栏的第一篇文章《什么Node.js》尝试从各个角度来阐述Node.js的基本概念、发展历史、优势等,对该领域不熟悉的开发人员可以通过本文了解Node.js的一些基础知识。 从名字说起 有关Node.js的技术报道越来越多,...
  • (Node.js)S2初识Node.js

    2020-03-09 12:24:21
    Node.js的特点和优势 他是一个JavaScript运行环境 依赖于Chrome V8引擎进行代码解析 事件驱动(event-driven) 非阻塞I/O(输入输出) 轻量、可伸缩、使用实时数据交互应用 单进程、单线程 Node.js安装 网址:...
  • 文件名不能取node.js 文件名不要包含中文 没有dom和bom(console.log(window);console.log(bom)) node是JavaScript解析运行环境 浏览器和node中执行的代码不能互相执行 文件读 浏览器中的javascript没...
  • 来源 |http://www.fly63.com/article/detial/9507Node.js已成为构建可伸缩Web应用程序的首选技术。由于它提供了许多重要的好处,因此在开发人...
  • Node.JS - socket.io教程

    千人学习 2018-06-27 17:24:37
    Node.JS是一套使用JavaScript...Socket.io是利用WebSocket技术封装的一个Node.JS模块,比起传统的AJAX交互方式大的优势就是快,即时性交互。该技术已经应用到各种领域,例如:文字视频通信、即时游戏、远程操作等等。
  • 用了一年多 Node.js, 现在已经是 Node.js 的脑残粉了,这篇日志比较杂,算是我对 Node.js 方方面面的一个集中吐槽。 首先是性能,用起来感觉 Node.js 的性能并没有想象中那么好。内存占用差不多和 Ruby 一个等级,...
  • Node.js权威指南》共16章,分三个部分:第一部分(第1~12章)从Node.js的特性、优势、适用场景、安装配置到各个模块的功能作用,再到开发的具体方法和技巧,非常详尽地讲解了Node.js开发者必备的各种基础知识;...
  • Node.js介绍、优势、用途

    万次阅读 2018-11-07 11:21:50
    一、Node.js介绍 Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与PHP、Java、Python、.NET、Ruby等后端语言平起平坐。 Nodejs是基于V8引擎,V8是...
  • 适用人群前端开发,前端工作,前端学习课程概述智能社:Javascript之Node.JS-经典教程:从理论到实战!基础部分(第1-6节)模块化(第7-8节)框架应用(第9-24节)数据库应用(第25-27节)项目案例 (第28-36节)课程总结、二...
  • 文章目录前言Node.js介绍Node.js的优势Node.js的应用场景合理的创建标题,助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • 这章会告诉我们,为什么Node.js更适合现代服务器架构。让我们喝杯咖啡,把这章学完。 “互联网”越来越是API和服务,而不是网站、应用、和网页。看完上一章,你可能觉得在实现服务器模板方面,Node.js并没有太多...
  • 适用人群 前端开发,前端工作,前端学习 课程概述 智能社:Javascript之Node.JS-经典教程:从理论到实战! 基础部分(第1-6节) 模块化(第7-8节) 框架应用(第9-24节) 数据库应用(第25-27节) 项目案例 (第28-36...
  • 适用人群前端开发,前端工作,前端学习课程概述智能社:Javascript之Node.JS-经典教程:从理论到实战!基础部分(第1-6节)模块化(第7-8节)框架应用(第9-24节)数据库应用(第25-27节)项目案例 (第28-36节)课程总结、二...
  • Javascript在Node出现之后,比别的编程语言多了一项优势,就是一些模块可以在前后端共用,这是因为很多API在各个宿主环境下都提供。 2.7.1 模块的侧重点 前后端Javascript分别搁置在Http的两端,它们扮演的角色并...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 使用 Node.js优势和劣势都哪些? 03月092014年 【宓俊的回答(151票)】: 我用 Node.js 开发了 Am I Hacked,算是一点用 Node.js 支持大流量的经验。先列一些数字 服务器是 Linode 512,也...
  • 用node开发web,Node.js比C# 好在哪,优势在哪,可以用实例说明
  • 今天学习node.js,相比于之前学习过的java,node.js有一些优越之处。原因是它是一个基于Chrome v8引擎建立的JavaScript运行平台。  (1)创建服务器:自行服务器来监听客户端的请求,类似于 Apache 、Nginx 等 ...
  • node.js

    2020-03-10 21:40:59
    优势 性能高,方便,入门难度低 劣势 服务器提供的相对较少 相对于其他语言,能用得上的学习资料少 对程序员的要求高 运行 开发注意 node.js 使用的事 ECMA 语法,不可以使用DOM BOM ...
  • Node.js

    2019-09-13 23:39:57
    创始人:Ryan Dahl 运行时引擎 :Google V8开源 ...最大的优势是借助JavaScript天生的事件驱动机制加V8高性能引擎,使编写高性能Web服务,通过模块化的JavaScript代码,加上函数式编程,并且无需考虑浏览器兼容...

空空如也

1 2 3 4 5 ... 20
收藏数 572
精华内容 228
热门标签
关键字:

node.js优势