关于node与Java web性能的对比
发布于 2 年前 作者 cncoder 10544 次浏览 来自 分享

看了朴灵大师的九浅一深,自己实验对比一下Java,关于node.js 的性能疑惑,一点都没有喷的意思啊,向来推崇:不以求备取人,不以己长格物,发帖求问只是好奇~~

先说明一下测试环境:

两台几乎一样配置的手提,在同一100M局域网

  • CPU:Intel i5 4210U

  • 内存:8G

  • 操作系统: win10

  • 测试工具: ab

  • 请求并发均是300

  1. 先测试express 简单的session检测页面,逻辑类似于login页面:

没有使用模板,看到各项性能测试数据还是不错,期间node服务进程CPU咱用率稳定在30%,内存使用90M,基本可以忽略

node index

  1. 再来 express login页面,输出模板是jade

此时延迟已经比较大,系统占用资源和1差不多,为什么延迟会达到7000ms这么高?本页面没有复杂逻辑可言

node_jade

  1. 接着就是Java web,与上面2相同,也是一个登录页面

几乎都在2000ms完成?在这里显示出来的,为什么java 处理并发性能明显比node好这么多?不同的是java虚拟机占用的内存达到700M,这么大的内存,对于32 位的node来说分分钟会挂。

java_tomcat

  • 在对比中有很多不严谨之处,但是侧面能看出一点问题:

12相比,是否说明如果在node里面使用jade模板技术会大大降低node处理并发的速度呢?如果是,这差距也太大了吧

23相比,同样在不优化的情况下,同样的业务逻辑,java web优胜于node,也就是Java虚拟机还是比V8厉害。

话说回来V8作者和Java虚拟机作者原来是同一位天才~~

28 回复

jade慢可以换ejs 看一下对比

@yakczh koa +ejs 测试下

来自酷炫的 CNodeMD

还有keep alive之类的调优参数呢?(总感觉是你测试的不对。。

来自酷炫的 CNodeMD

你们不看win10,32位吗?

@zaaack 我再试一下koa 和 ejs结合看看~

@i5ting 是win10,64位的。后面那里说起32位只是说说V8在32位下默认不支持那么大的内存而已

jsp最后都会被编译成servlet,每一个jsp在容器启动时会创建一个单例对象(tomcat是这样的,其它容器不一定),所以每次访问就相当于调用了一个方法。 而jad/ejs的机制是读取文件,替换内容,是字符串操作,在访问较高的情况下,必然会出现问题。 同时我要指出,测试一中的90M内容是指这个V8占用的内存,还没有计算的有buffer内存,加上这一部分内存,并一定比Java低。 一般来说,在node技术栈中,页面的渲染是放到浏览器中的,而node更多的时候是提供API。 我使用node的理由有二点:一、容易整合技术栈 二、基于node的微服务架构 如果不使用微服务架构,还不如使用PHP。

每种语言都有其优点和缺点,选择合适的用就行了,效率问题?买更强大的电脑,能用钱解决的问题是问题吗? 论执行速度,java的确比node快但是java太耗资源了,几百元的安卓机性能甚至都强于十几年前的电脑了,却因为安卓用java开发而卡出翔, node似乎和php的速度差不了多少,但是node有异步io的优势,我选择Node是因为js成为了前后端统一的编程语言,未来应该是js的

@zengming00 java的确比node快,有依据么?

@i5ting 差不多像这样的程序,java在100毫秒以下,php和Node都在800毫秒左右

for(i=0; i<100000; i++){
	try{
		throwErrorFunc();//
	}catch(e){}
}

@i5ting 可怕,求大神指教

@zengming00 try catch 因为流程不确定,JIT很难在运行时优化这样的代码,所以v8对try catch中的代码是无法生成优化编译的版本的,推荐是把try catch里面的东西写到一个函数里

谢谢各位老大指导。让我有个基本认识~~

感觉实验还需要再严谨些,第三方库的性能数据并不能作为引擎性能比较的依据,除非两个引擎的使用相同设计思想的第三方库测试,控制变量法。

浏览器端-服务端完全分离的路过。。。

@cncoder Java 和 Node 差别还是很大的。Java 可以用多线程,静态类型。JavaScript 只能单线程,动态类型(对编译器不友好,导致优化相对难一些)。另外就是 Web 服务模型上有差别,多线程服务 vs (单线程事件驱动 + 多进程)。

如果只做运行时的性能对比的话,建议拿掉 Web 层,都用单线程渲染模版(不用怀疑,还是 Java 会快些)。V8 和 JVM 尽管模型类似,不过还是有不小的差距。不过相比 P*、R* 之类的语言还是要牛许多。

@hyj1991 请问把try catch里的东西写到一个函数是何意?

@hyj1991 看了下测试发现写到函数里也并没有提升多少性能

@i5ting 如果这样的话,在方法用了try catch 捕获错误对性能的影响有多大? 如果不用try catch还有什么替代方案吗?

@qingmingsang 你看看狼叔jsperf测试呢。。。基本差10倍吧

@hyj1991 你是不是看错了。。。。

 control - no try/catch
test1();

	59,546
±1.01%
fastest


try/catch inside function
test2();

	29,078
±3.12%
52% slower


try/catch outside function
test3();

	26,855
±2.33%
55% slower

koa2 + 用 bluebird 替换全局的 global.Promise + marko 模板系统再试试 Jade 是 JS 里最慢的模板之一,而且早就作废了现在替代者是 Pug. @zaaack @cncoder @yakczh ejs 也比较慢

语言的执行效率肯定 java 高,本身语言特性也决定了 java (静态) 比 js(动态) 快,主要用 node 是前后端语言统一, 轻量级全栈效率高。
王垠一篇文章介绍Java:http://www.yinwang.org/blog-cn/2016/01/18/java 有王垠独到的见解。

node的评测性能太多了, tomcat 根本比node差很多,jetty才快。 多进程node能跑到50000万并发,只比go慢一些。单进程node2万多,比spring的 tomcat快不少 https://www.techempower.com/benchmarks/

@andyhu art-template 和 pug 比较呢?那个快?

首先用windows做测试就是一个joke,其次这种比较毫无意义。 不妨我们来个实际场景,在一台普通的linux服务器上跑20个spring boot的微服务试试?!你的微服务可以什么都不做,就一个hello word接口,你会发现呵呵内存不够用啦,20个nodejs程序呢?毫无鸭梨!

回到顶部