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

iefreer 发表于 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(2) negative(0) views1400 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/


请先 登录 再评论.
相关文章
  • CSS3特性查询(Feature Query: @supports)功能简介

    这是2017年不能不了解和学习的一个CSS新特性,非常实用,考虑到现实世界浏览器的复杂性,该特性本应该先于其他新特性出来。我们已经知道使用媒体查询(Media Que...

  • 常见面试题JS语言中四种函数调用方式实例讲解

    JS的语言世界中函数(function)是一等公民,函数的调用有多种方法。普通调用这个是最常见和直接的方式:function

  • 常见面试题JavaScript闭包(ES5语法)

    JavaScript闭包(Closure)是常见的JS面试题,是否理解闭包是一个简单的区分JS初级和高级程序员的判例。几乎每个JS程序员都在使用闭包,有意或无意间。比如编写一个jQuery鼠标点击处理函数:$(function()

  • CSS3弹性布局内容对齐(justify-content)属性使用详解

    内容对齐(justify-content)属性应用在弹性容器上,把弹性项沿着弹性容器的主轴线(main axis)对齐。该操作发生在弹性长度以及自动边距被确定后。 它用来在存...

  • 深入理解JS和CSS3动画性能问题和技术选择

    本文对比了JS及其框架和CSS3的动画性能,并深入剖析了其内在原因。技术结论大致如下:1. jQuery出于设计原因,在动画性能上表现最差2. CSS3由于把动画逻辑推给了...

  • 学习使用CSS制作进度条

    进度条是基础的界面控件,可用于多种场合,比如任务完成进度,手机充电状态等。本文介绍一个简单实用的进度条制作方法。预期效果如下图所示:直观上,我们可以把该进度条控件分为2个部分,外部的边界用来表示固定的目标范围,里面的条形部分用来表示当前进度。外部目标范围元素的CSS代码编写如下:.pb-scope

  • 粒子运动模拟 - Verlet积分算法简介

    Verlet算法是经典力学(牛顿力学)中的一种最为普遍的积分方法,被广泛运用在分子运动模拟(Molecular Dynamics Simulation),行星运动以及织物变形模拟等领域...

  • 纹理基础知识和过滤模式详解

    1、 为什么在纹理采样时需要texture filter(纹理过滤)。
    我们的纹理是要贴到三维图形表面的,而三维图形上的pixel中心和纹理上的texel中心并不一至(pixe...

  • Three.js入门教程2 - 着色器(下)

    这是WebGL着色器教程的后半部分,如果你没看过前一篇,阅读这一篇教程可能会使你感到困惑,建议你翻阅前面的教程。

  • 如何使用CSS3实现一个平滑的3D文本标题

    要实现3D文本,基本上有3种方法:1. 使用CSS3的投影滤镜(filter: drop-shadow)2. 使用3d建模和CSS3 3d变换来实现(最真实)3. 使用CSS3 text-shadow属性来实现...

  • Processing.js和P5.js的功能简介和区别

    什么是ProcessingProcessing是关于数字艺术的编程语言,支持跨平台,语言本身是一个类Java语言,程序文件的后缀为.pde。
    什么是Processing.js为了能让Proce...

  • 使用requestAnimationFrame和Canvas给按钮添加绕边动画

    要给按钮添加酷炫的绕边动画,可以使用Canvas来实现。基本的思路是创建一个和按钮大小相同的Canvas元素,内置在按钮元素中。然后在Canvas上实现边线环绕的动画。...

  • 如何使用CSS3/SCSS实现逼真的车窗雨滴效果

    在天气预报类的Web移动应用中,常常需要实现屏幕的雨滴效果,表示阴雨天气。感觉上比较神奇,其实想通了,这个效果的实现只需要一点物理知识和CSS3的简单变换。实现一个小雨滴首先雨滴是一个个小的椭圆形元素:.raindrop

  • 更多...