NodeJS、Java和PHP性能考量和若干参考结论
首先需要说明的是,严格而言NodeJS和Java、PHP并非对等概念,NodeJS是基于JS的一个应用程序,而Java/PHP是语言。
我们这里实际指的是分别使用node、java和php来实现一个网页应用,在这样的相等用例下,各自的性能表现。
自从2013年Paypal应用迁移到Node后,NodeJS被越来越多的巨头所使用。
这里面当然不只是技术层面的考虑,还有商业层面的考虑,因为Java规范实际上是由Oracle(Sun)所控制,而大公司显然不愿意把自己的核心平台全部建立在一个随时有可能收取授权使用费用的平台上。
撇开这个不谈,本文简要分析下这3个体系关乎性能的核心架构和概念。
Node架构
Node是一种异步单线程模式,所谓单线程指的是相对于Java而言,
实际上Node是单个主线程加上一堆工作线程,主线程负责接收请求,派遣任务和处理输出回调:
异步模式的好处,显然是具有更好的交互响应度,缺点是需要更高的管理成本。
如果你在超市只买了一瓶饮料,而前面的人买了一堆家用品,你必须等前面的人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要稍胜一筹。
2.原生PHP的速度要差了一倍多:
而nodejs在完整实现了ORM的情况下,速度居然能和原生PHP相近,且使用postgres时,性能不如mysql。
3.Java的主流开发框架play和spring表现如下,相差不多,比PHP的Yii2和Larval要高4倍左右:
而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构建的电商主业务迁移过来,除非你有足够的时间、经费和资源来自行排除各种应用坑(尤其是处理关系型数据上),代码、社区和文档都还不稳定。
最新评论
参考阅读:
https://projectricochet.com/blog/top-10-meteor-performance-problems
参考阅读:https://rclayton.silvrback.com/speaking-intelligently-about-java-vs-node-performance
参考阅读:http://www.infoworld.com/article/2975233/javascript/why-node-js-beats-java-net-for-web-mobile-iot-apps.html
- 相关文章
微信公众号在线生成二维码带参数怎么搞?
带参数二维码是微信公众号渠道二维码的一种实现
微信的带参数二维码有两种,一种是临时二维码,一种是永久二维码,但是永久二维码的生成是有个数限制的,微...增强现实引擎ARToolKit工作原理简介
ARToolkit是一个基于CV(计算机视觉)和Marker(标识)的开源增强现实引擎。其具备如下功能特性:A. 鲁棒跟踪,包括基于标记的跟踪与基于特征的跟踪;
谷歌ARCore技术特性简介
谷歌美国时间2017.8.29号刚发布了ARCore预览版,这是一个类似于苹果ARKit的增强现实SDK,在此之前,谷歌虽然已投资AR平台Tango,但由于需要特定的硬件和传感器,...
如何使用BabylonJS加载OBJ或STL模型
BabylonJS(也就是babylon.js,这是一个和three.js类似的WebGL开发框架),更多的用在游戏领域。
本文说明和演示如何使用babylon.js来加载一个标准3d模型文...函数式JavaScript编程基础概念:Curry和Partial Application
本文介绍JS函数式编程中的两个概念:柯里(Curry)和部分应用程序(Partial Application)。什么是应用程序(Application)将函数应用于其参数以产生返回值的过...
JavaScript事件模型图解
在JavaScript中用户交互的核心部分就是事件处理。本文为对事件模型和处理机制的总体性描述。Event是什么?
event是用户操作网页时发生的交互动作,比如clic...如何使用CSS3合成模式(blend-mode)和滤镜(filter)实现彩色蜡笔(时光机)照片特效
在之前的文章中我们已经详细讲解过CSS3滤镜(filter,也可称之为过滤器)的工作方式,本文将实现一个当下流行的时光机相片特效实例来说明其实际用途。
我们...使用HTML5 FileReader和Canvas压缩用户上传的图片
手机用户拍的照片通常会有2M以上,这对服务器带宽产生较大压力。因此在某些应用下(对图片要求不那么高)我们可以在客户端来压缩图片,然后再提交给服务器。总体...
HTML5动画背后的数学2 - 仿生智能算法综述
使用SVG和CSS3创建圆形进度条动画
圆形进度条是一个经典的控制面板元素,常用于显示任务进度,比如用户档案的完整程度,或者升级状态。有很多方法来实现圆形进度条,比如用JS, CSS3, Canvas, SVG...
粒子运动模拟 - Verlet积分算法简介
Verlet算法是经典力学(牛顿力学)中的一种最为普遍的积分方法,被广泛运用在分子运动模拟(Molecular Dynamics Simulation),行星运动以及织物变形模拟等领域...
如何使用Three.js加载obj和mtl文件
OBJ和MTL是3D模型的几何模型文件和材料文件。在最新的three.js版本(r78)中,以前的OBJMTLLoader类已废弃。现在要加载OBJ和MTL文件,需要结合OBJLoader和MTLLoade...
如何实现SVG clipPath自适应被裁剪对象
CSS3中引入的clip-path(裁剪路径)属性是一个很强大的特性。
clip-path的含义如下图所示,好比剪纸一样,你用剪刀沿着某条路径把目标对象(图像或元素)裁...SVG过滤器feColorMatrix矩阵变换效果用法详解
在计算机图形学(数学)中,矩阵乘法可用于把空间向量进行几何变换。我们可以把颜色的值(RGBA)表示成一个四维空间向量:color = (r, g, b, a);那么就可以应用...
更多...