看了朴灵大师的九浅一深,自己实验对比一下Java,关于node.js 的性能疑惑,一点都没有喷的意思啊,向来推崇:不以求备取人,不以己长格物,发帖求问只是好奇~~
先说明一下测试环境:
两台几乎一样配置的手提,在同一100M局域网
-
CPU:Intel i5 4210U
-
内存:8G
-
操作系统: win10
-
测试工具: ab
-
请求并发均是300
- 先测试express 简单的session检测页面,逻辑类似于login页面:
没有使用模板,看到各项性能测试数据还是不错,期间node服务进程CPU咱用率稳定在30%,内存使用90M,基本可以忽略
- 再来 express login页面,输出模板是jade
此时延迟已经比较大,系统占用资源和1差不多,为什么延迟会达到7000ms这么高?本页面没有复杂逻辑可言
- 接着就是Java web,与上面2相同,也是一个登录页面
几乎都在2000ms完成?在这里显示出来的,为什么java 处理并发性能明显比node好这么多?不同的是java虚拟机占用的内存达到700M,这么大的内存,对于32 位的node来说分分钟会挂。
- 在对比中有很多不严谨之处,但是侧面能看出一点问题:
1和2相比,是否说明如果在node里面使用jade模板技术会大大降低node处理并发的速度呢?如果是,这差距也太大了吧
2和3相比,同样在不优化的情况下,同样的业务逻辑,java web优胜于node,也就是Java虚拟机还是比V8厉害。
话说回来V8作者和Java虚拟机作者原来是同一位天才~~
jade慢可以换ejs 看一下对比
还有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里面的东西写到一个函数里
無fuck說
谢谢各位老大指导。让我有个基本认识~~
感觉实验还需要再严谨些,第三方库的性能数据并不能作为引擎性能比较的依据,除非两个引擎的使用相同设计思想的第三方库测试,控制变量法。
浏览器端-服务端完全分离的路过。。。
@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
@i5ting 学习了
语言的执行效率肯定 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 比较呢?那个快?