Java与Node.js性能PK

原文连接:https://www.tandemseven.com/b...java

若是你打开浏览器,搜索“Java与Node.js哪一个更快”,你会发现大部分答案声称Node.js更快,也有一些人持相反意见。Java使用JIT编译器,其性能甚至能够超过C++。在这种状况下,为何这么多人仍是声称Node.js要比Java快呢?小编如今就跟你们一块儿往下看。node

实际检验结果git

实际上,在处理原始计算任务方面,Node.js并不比Java快;一旦涉及到IO型任务,Java就没有竞争力了。也就是说,在典型的Web应用程序执行的任务类型场景中,Node.js运行速度确实比Java更快,在接下来模拟的4种场景测试的结果充分验证了这一点。github

性能因素数据库

为了更好的理解Node.js如何完胜Java,须要考虑到3个性能因素:IO,并发和计算。这三大因素对于提升应用程序的总体运行速度和吞吐量都是有影响的。后端

一、IO数组

根据servlet规范,Java在早几年前引入的NIO其实是Java编写后端服务器代码的标准。在整个规范中,servlet API都假定代码能够而且将在每一个级别阻塞。虽然过去几年规范有所改进,可以容许非阻塞请求处理,但servlet规范的基本范例仍然彻底包含IO阻塞。这意味着以非阻塞方式写入磁盘或使用JDBC写入数据库的操做会阻止处理线程执行任何其余操做。虽然Java可以以非阻塞的方式工做,可是对于基于servlet技术的Java应用程序来讲,实现一个非阻塞服务器仍然是不切实际的。对于Java社区来讲,这一点是很是遗憾。浏览器

另外一方面,JavaScript彻底支持非阻塞IO。JavaScript API不提供阻塞选项,在每一个级别上强制支持非阻塞API规范。这意味着在执行IO操做时,Node将永远不会被阻塞,而且在等待IO时,Node将始终能够自由地处理其余工做。从而,Node可以很是高效地使用服务器的处理和内存资源。具体来讲,Node只需一个线程就能够同时处理和发出数千个IO操做。缓存

二、并发服务器

在Web框架中,Java和Node以两种大相径庭的方式实现并发。

Java:它为处理的每一个传入请求指定一个线程。随着并发请求数的增长,线程数也必须增长。若是计划同时处理最多100个请求,则须要有100个线程池可供处理。

Node:使用一个线程来处理全部传入的请求。因为Node是非阻塞的,它有足够的时间对全部请求执行全部计算和转换,同时等待任何IO操做。

三、计算

虽然谷歌的V8 JavaScript引擎将JavaScript编译成机器代码,这结果让人印象深入。可是,在某些场景中,Java是优于Node的。好比,您要让Java与Node进行纯计算PK,计算前5000个素数,那么Java每次都会轻松获胜。

Web应用程序存在大量的IO操做

Web应用程序执行大量的IO。首先,从浏览器接受请求;这是IO操做。其次,应用程序一般从数据库中获取请求的数据;这也是IO操做。一旦计算出全部响应数据,应用程序就会将响应数据发送回浏览器;这也是IO操做。应用程序可能一直都在维护日志;这仍是IO操做。实际上,Web应用程序大部分时间都花在IO操做上,而不是计算。

对于Web应用程序而言,它为每一个请求提供服务,须要执行大量的IO,对比之下,Node要比Java更加的适合。

Web应用程序须要高并发

一般,一个Web应用程序有不少个用户同时访问。基于Java必须为每一个请求的生命周期指定一个线程,因此它须要大量线程来实现并发。若是在同一时间,应用程序的访问用户增长,那么在全部这些线程之间进行时间分割,很快就会变得很是昂贵而且低效。最终,随着线程数量的增长,操做系统忙着在全部线程之间进行切换,将变得很是繁忙,以致于CPU时间爆满后没法作任何实际工做。

这种大规模的状况下,Node的效率就很明显了。当Node以最大负载运行时,虽然CPU会很是繁忙,但操做系统可以轻松自如的应付。全部的CPU时间都将用于服务请求上。

Java与Node性能PK模拟

为了证实Node确实能够超越Java,本文介绍了4种场景,在这些场景中经过使用模拟器来测试这两种技术的性能。此模拟器的代码,你们能够经过下面的连接找到:

https://github.com/johnrjenso...

注释:

本测试中,为Java实现模拟阻塞IO。有些人可能会认为使用阻塞IO并不公平地比较Java的性能,但在本测试中使用阻塞IO的缘由以下:①Java的JDBC规范仍然是一个阻塞规范,这意味,每当有人使用标准JDBC驱动程序链接到关系数据库时,都必须阻塞。② Apache Tomcat 8.5在2016年6月才完成了第一个非阻塞Servlet规范,这意味着绝大多数生产Java应用程序在执行IO时仍会阻塞。所以,由目前大多数组织以阻塞的方式使用Java,因此在本次模拟中,阻塞也是最具备表明性的Java。

场景1:纯计算速度

在第一个场景中,选择一个纯计算工做负载来证实Java的计算优点。分别在有和没有并发的状况下进行测试模拟,工做负载状况:

1a:①无并发;②计算500个质数;③执行0个阻塞IO调用。

1b:①有并发;②计算500个质数;③执行0个阻塞IO调用。

测试结果以下:

1a:纯计算任务在没有使用并发时,Java速度是Node的2.1倍左右;

1b:一旦将并发加入到任务中,Java领先Node的速度下降到1.8倍。

图片描述
图片描述

场景2:大量IO操做

第二种模拟中,不作任何计算工做,只执行IO任务。分别在有和没有并发的状况下进行测试模拟,工做负载状况以下:

2a:①无并发;②计算0个质数;③执行4个阻塞IO调用;④处理一个5MB文件。

2b:①有并发;②计算0个质数;③执行4个阻塞IO调用;④处理一个5MB文件。

结果以下:

2a:没有并发时,Node的速度是Java的3.4倍;

2b:有并发时,Node的速度增长到Java的8.5倍。添加并发后,Node与Java之间的差别更加明显。

图片描述
图片描述

场景3:均衡的工做负载

此场景与典型Web应用程序的请求工做负载最接近,模拟中同时执行IO和计算任务,均衡工做负载。一样,也是在有和没有并发的状况下分别模拟。

工做负载状况:

3a:①无并发;②计算500个质数;③执行4个阻塞IO调用;④处理一个5MB文件。

3b:①有并发;②计算500个质数;③执行4个阻塞IO调用;④处理一个5MB文件。

测试结果:

3a:没有并发时,Node的速度是Java的1.8倍;

3b:有并发时,Node的速度增长到Java的4.9倍。

图片描述
图片描述

场景4:长时间运行的查询

工做负载状况:

①计算500个质数;②发出一个很长的阻塞IO调用——10s响应时间;③处理一个5MB文件

测试结果:

Java每秒6个请求;Node每秒64个请求,是Java的10倍

观察结果可以发现,执行长时间运行的查询,Java运行的性能大大受影响,但相同场景下,Node的性能几乎没有下降。也就是说,Node完胜Java。

图片描述

结论

在典型Web应用程序的真实场景中,Node确实是比Java运行速度更快、更具可伸缩性。对于Web应用程序开发来讲,Node的性能是难以比拟的。因为Web应用程序大部分时间都在作IO,而且须要高并发,相比之下,Node显然是最终的赢家。

关于Node.js的性能指标

一、事件循环

事件循环意味着可以在队列中执行代码。事件循环能让Node.js执行非阻塞IO操做。所以,服务器能够处理无限数量的操做。系统能够处理异步操做。事件循环这个指标衡量事件处理延迟。

二、实时用户行为

实时用户行为指的就是用户(客户)在使用应用程序时所作的事情。举个例子,Uber或Netflix用户可在几秒钟内完成业务交易,这就反映出了了Node.js的效率。实时用户行为这个指标是测量响应时间的。

三、外部框架

Node.js应用程序也一样依赖于其余的服务、系统和数据库。它可能会链接到其余应用程序,缓存等,所以也必须记住这戏依赖关系。经过这些外部框架,能够检查应用程序的响应时间,请求率,错误率,内容大小,API,等等。

四、进程内存

Node.js有一个很棒的助手工具——垃圾收集器,它管理应用程序的内存并防止内存泄漏。首先,您能够测量在GC上花费的时间——运行越屡次,系统中的暂停次数也就越多。其次,还能够比较每次运行时的内存并检查构建趋势。

Node.js的优势

Node.js是一种非阻塞事件驱动模型,它可以让开发人员实时构建应用程序。经过推送技术和双向链接,许多大企业都在使用它。那么,使用Node.js都有哪些好处呢?

小编跟你们一块儿来看下:

1.速度(在Google JS引擎上运行);

2.非阻塞I/O模式

3.数据流(HTTP请求和响应做为的单个事件)

4.实时应用(客户端和服务器端)

5.统一的数据库查询(JSON格式)

6.编码简单快速

7.开源NPM存储库(超过600000个模块)

8.代理服务器能力

9.快速的开发周期

10.服务器上的业务逻辑

11.适用于Android设备

相关文章
相关标签/搜索