NodeJS、Java和PHP性能考量和若干参考结论

techbrood 发表于 2016-12-14 19:51:26

标签: nodejs, java, php, performace, benchmark

- +

首先需要说明的是,严格而言NodeJS和Java、PHP并非对等概念,NodeJS是基于JS的一个应用程序,而Java/PHP是语言。

我们这里实际指的是分别使用node、java和php来实现一个网页应用,在这样的相等用例下,各自的性能表现。

自从2013年Paypal应用迁移到Node后,NodeJS被越来越多的巨头所使用。

这里面当然不只是技术层面的考虑,还有商业层面的考虑,因为Java规范实际上是由Oracle(Sun)所控制,而大公司显然不愿意把自己的核心平台全部建立在一个随时有可能收取授权使用费用的平台上。

撇开这个不谈,本文简要分析下这3个体系关乎性能的核心架构和概念。

Node架构

Node是一种异步单线程模式,所谓单线程指的是相对于Java而言,

实际上Node是单个主线程加上一堆工作线程,主线程负责接收请求,派遣任务和处理输出回调:

图片1.png

异步模式的好处,显然是具有更好的交互响应度,缺点是需要更高的管理成本。

如果你在超市只买了一瓶饮料,而前面的人买了一堆家用品,你必须等前面的人10分钟处理完成后,才花1分钟处理你的购买。

那么你就能明白异步模式的好处。异步模式相当于在收银员前面加了个管理员,然后收银员点好商品按先后次序通知管理员。

此外NodeJS借助Node Cluster库也可以实现多进程。

Java架构

Java网页应用是多线程模式(可以是阻塞式也可以是非阻塞式),多线程的好处是共享内存,坏处是可能会产生死锁。

对于性能而言,理论上采用非阻塞式模式时,其性能应该和Node相仿,能否更快就取决于各自JIT编译器的效率以及Web应用服务器的实现是否引入了额外的消耗。

PHP架构

为了追求简单,PHP是多进程(单线程)同步模式的,每个进程处理一个用户请求,另外PHP目前只有中间码(opcode),仍然需要解释执行,这也会牺牲性能(可能后续版本会加入JIT功能)。PHP的简化设计思想使得其不适合做高并发和大计算量的任务,但很适合广大的中小型网站,这也是为什么Facebook费了老大力气自己实现了个HHVM的原因。

测试数据和结论

上面只是粗略的理论分析,这里有一个Benchmark数据表,测试用例是从数据库读取若干数据并显示:

https://www.techempower.com/benchmarks/#section=data-r13&hw=ph&test=fortune

里面的测试数据很有参考价值,这里简单归纳下和本文相关部分:

1.Java Servlet(Resin服务器)和NodeJS在不实现ORM的情况下,速度相当快,其中Java要稍胜一筹。

blob.png

blob.png

2.原生PHP的速度要差了一倍多:

blob.png

而nodejs在完整实现了ORM的情况下,速度居然能和原生PHP相近,且使用postgres时,性能不如mysql。

3.Java的主流开发框架play和spring表现如下,相差不多,比PHP的Yii2和Larval要高4倍左右:

blob.png

blob.png

blob.png

而Yii2的性能比Laravel(未实现ORM的情况下)要高30%左右,而Laravel在实现了ORM的情况下,性能要更低。

4.还有一个有意思的地方是,hhvm对于简单的数据库读取显示,并不能带来多大好处,这个也好理解,因为代码量不多,计算量不大。

5.另外nodejs的几个开发框架express/hapi/sails的性能表现并不好(实现了ORM的情况下),尤其是sails很慢。meteor的性能也口碑不佳,这可能是其架构过于强调实时更新(基于Socket.io)而引起的额外服务负担,并非所有应用都是即时聊天或多人对战游戏。总体上个人认为对于meteor/sails这些nodejs MVC框架,当前阶段可以尝试学习和在一些边缘项目(比如聊天类)上练手,别轻易把原先使用Java/PHP/.Net构建的电商主业务迁移过来,除非你有足够的时间、经费和资源来自行排除各种应用坑(尤其是处理关系型数据上),代码、社区和文档都还不稳定。

possitive(14) views10948 comments5

发送私信

最新评论

iefreer 2016-12-15 16:11:29

参考阅读:
https://projectricochet.com/blog/top-10-meteor-performance-problems


iefreer 2016-12-15 15:46:48

参考阅读:
https://kev.inburke.com/kevin/dont-use-sails-or-waterline/


iefreer 2016-12-14 19:53:57

参考阅读:https://rclayton.silvrback.com/speaking-intelligently-about-java-vs-node-performance


iefreer 2016-12-14 19:53:47

参考阅读:http://www.infoworld.com/article/2975233/javascript/why-node-js-beats-java-net-for-web-mobile-iot-apps.html


iefreer 2016-12-14 19:53:28

参考阅读:https://www.sitepoint.com/isomorphic-javascript-applications/


请先 登录 再评论.
相关文章
  • 2019年开源WebRTC媒体服务器选型比较

    什么是WebRTC服务器?在WebRTC的早期开始,该技术的主要卖点之一是它允许点对点(浏览器到浏览器)通信,几乎没有服务器的干预,服务器通常仅用于信令(比如用于...

  • 增强现实引擎ARToolKit工作原理简介

    ARToolkit是一个基于CV(计算机视觉)和Marker(标识)的开源增强现实引擎。其具备如下功能特性:A. 鲁棒跟踪,包括基于标记的跟踪与基于特征的跟踪;

  • 常用光照类型基本概念工作原理及其计算公式

    在三维场景中,原理上物体的渲染效果取决于光照与物体表面的相互作用,对于渲染程序而言,可以通过把一些数学公式应用于像素着色来实现,从而模拟出真实生活中的...

  • WebGL Roadmap

    Unity 5.0 shipped with a working preview of our WebGL technology in March this year. Since then, Google has disabled (by default) NPAPI support in the...

  • JavaScript语言多编程范式简介

    和C++等语言类似,JS支持多范式(paradigms)编程。我们常常混合这些范式来完成一些大型Web项目。JS支持3种编程范式:命令式、面向对象和函数式。命令式(Imperative JavaScript)命令式就是简单的从上而下完成任务,流水账过程式编码风格:function

  • 使用CSS3 box-decoration-break特性实现多行文本样式

    当文章中的长文本被自动断行为多行文本时,其样式可能会出乎我们的设计。本文介绍如何使用CSS3中的box-decoration-break特性来处理多行元素样式。
    按照规范...

  • 前端开发框架技术选型:Angular2 VS React VS jQuery

    Angular和React是主流的2个前端开发框架,但是严格来说两者并非对等的概念。Angular是一个基于MVC(或者MVVM)的框架,包含model(模型)/view(视图)/controll...

  • 深入理解CSS3滤镜(filter)功能和实例详解

    CSS3滤镜功能源自SVG滤镜规范,SVG滤镜最早用来给矢量图添加类似PS中像素图的一些特效。
    把这个滤镜功能引入到普通HTML元素中可以带来很有趣的效果(模糊、...

  • 深度贴图(depth map)概念简介和生成流程

    Depth map 深度图是一张2D图片,每个像素都记录了从视点(viewpoint)到遮挡物表面(遮挡物就是阴影生成物体)的距离,这些像素对应的顶点对于观察者而言是“可...

  • Three.js入门教程5 - 10个必须知道的编程技巧

    作者为Google的Paul,关于如何写出好的WebGL代码的文章。和很多开发者一样,我通过实践学习,但同时我也向其他更有经验的开发者们学习。在过去的几个月中,我在c...

  • 如何使用WebGL实现空气高温热变形动画特效

    我们在炎炎夏日,或者在火堆旁,经常会观察到热源周围空气的不稳定波动现象。本文将讲解如何通过WebGL来实现这个特效。该效果可用于热变形、波浪、水面波光等场...

  • 如何使用CSS3实现一个3D商品标签

    使用3D缎带形状的标签是常见的一个设计模式,用在商品折扣、文章标题或网站推荐信息上,来突出显示重点内容,吸引用户视觉焦点。实现的方法有2种,一种是使用背...

  • SVG过滤器feColorMatrix矩阵变换效果用法详解

    在计算机图形学(数学)中,矩阵乘法可用于把空间向量进行几何变换。我们可以把颜色的值(RGBA)表示成一个四维空间向量:color = (r, g, b, a);那么就可以应用...

  • 在PHP网页程序中执行Sass/Compass命令

    我们需要在wow云开发平台支持sass/compass等预编译样式语言,为此我们首先尝试了scssphp扩展,但是在支持最新语法上,经常会出现异常。所以我们采用了代理的方式...

  • 更多...