[ 争鸣 性能] PHP与JSP运行速度之再比较 ----转

发表于:2007-05-25来源:作者:点击数: 标签:php性能之再争鸣速度
PHP与JSP运行速度之再比较 作者:patrickwang 一些废话 关于PHP和JSP的运行速度之比较,两者的起源地--美国的网路上已经争论了很长时间。给人的感觉是PHP社群总是说没有任何官方任何的测试标明JSP一定要比PHP快速,但是JSP社群也总是坚持编译执行的JSP在先天

PHP与JSP运行速度之再比较 
作者: patrickwang 

一些废话 

  关于PHP和JSP的运行速度之比较,两者的起源地--美国的网路上已经争论了很长时间。给人的感觉是PHP社群总是说没有任何官方任何的测试标明JSP一定要比PHP快速,但是JSP社群也总是坚持编译执行的JSP在先天就比解释执行(由于Zend公司的努力,现在的PHP也应该是接近编译模式运行了)的PHP要快速。就我本人的观点,两者的运行速度比较实际上意义并没有想象中那么重大--在一个PHP的工程中,我们绝对依赖PHP;而在一个用到JSP的工程中,很多情况下JSP只是起到MVC模式中的表示或者控制的作用,真正的支持还在于其后真正的Java家族(比如Servlet,Bean甚至是EJB等等)。因此如果过分看重PHP和JSP在各自速度上的比较,可能并不能说明由该两种技术构建的工程的速度因素。(至于说是否存在完全由JSP构建的工程,我想是有的,不过希望以后维护这个工程的家伙不是我) 

  但是我还是做了几次有趣的测试--毕竟让代码们用数字展示各自的能力是一件很奇妙的事情,并且之前我也做过有关PHP代码速度测试和优化的工作,由此获得的一些成就感很容易让人忘记自己在其上花费了一夜时间。其实我做的工作也很简单,先是比较一些简单运算的速度,然后是测试和数据库连接的速度。我的用意是把前者比作一般的表示层和控制层的工作,而后者则被希望表示一般的逻辑层所作的工作。还是MVC模式。 


开始测试 

  照例是要把测试的环境介绍一下,我采用了一台Linux(我的开发环境)和一台Windows(我的猪窝了)机器进行相同的测试(这样也可以顺便让Linux再羞辱Windows一次)--所谓相同是指代码的内容相同--非常感谢我喜欢的这两种语言都是跨平台的。具体的配置如下: 
   


(猜猜看同样的代码在哪台机器上跑得快哪?下面你将会得到答案) 

  然后就是一些简单的Coding。我把写好的JSP放在了Linux平台上,首先是1000×1000次的算术运算操作,采用两个for循环完成它。这样的循环次数比较保守,因为我也不知道JSP究竟是否能在我不耐烦的按下浏览器的"停止"按钮之前执行完它们--可是事实却让我小小的吃惊了一次--在大约13毫秒左右的时间内这样数目巨大的循环被完成了。于是我又很不平衡的在两个循环的最大数后面各加了一个0--10000×10000次循环!不出我所料,等待的时间也不过是1.33-1.34秒左右。应该说,在没有写PHP的相关功能之前,我已经感觉到了JSP的强大速度优势。 
  好了,让我们再来看看PHP在Linux和Apache中的表现--1000×1000勉强通过,但是花费了竟然有5秒左右之巨;随后的10000×10000次测试真是一场灾难,我在页面中设置了PHP的执行时限为不限,但是结果是对于我来说这段代码真正的是不限时间的在孜孜不倦的运行,始终没有返回。OK,STOP IT!所以这一项测试没有结果。 
  在Windows平台的表现一样,不过看来速度都慢了一些,这个结果让我心理很安慰。 

  下面一项是连接和操作数据库的测试,我选择了MySQL。从上面的测试环境中可以看出在Linux机器上另有Oracle在运行着,但是有两个原因让我并没有使用Oracle参与测试,一是考虑到MySQL在Linux平台上已经得到了广泛的应用;二是Oracle在我周围的客户中使用并不多见。选择的数据库操作是SELECT,而且看来不能像普通的算术运算那样动辄就是1000×1000,我首先选择了10×10的二重循环。很明显,JSP在进行数据库操作时要比普通运算时慢了许多,让我等待了260毫秒左右;而当我鼓起勇气对JSP进行100×100测试之后,我才发现自己又陷于一场漫长的等待--最终29秒左右完成了这一操作。 
  对于PHP,我没有抱很大希望,先前的测试已经说明了PHP的普通运算能力确实有所欠缺。但是LAMP的组合又让我看到了速度的影子--实际的测试结果让我吃惊不小,10×10的测试PHP几乎在瞬间完成(85毫秒左右),而100×100的测试也仅仅花费了8.33秒左右。 

  以下是测试的条件和数据表,这里(speed_test.zip)可以下载测试用例: 




结论 

  以上的测试只是我突发感慨而来的产物,那时我正在考虑一个简单的基于Web的商店是否值得完全使用JSP来实施--虽然我一直非常中意MVC模式并且在PHP中也引入了这样的概念,但是对于Web项目的"超快速开发"来说采用完全JSP倒也不失为达到目标并且可以有效保证项目的开发速度和运行速度的一种方式。于是我就想到了应该测试一下JSP和PHP的差距。不过结果并不能让我满意--在数据库的连接方面,借助JDBC可以达到数据库层的透明,但是速度上似乎有了许多的折扣;至于那种1000×1000的计算,如果有这样的网上商店会经常使用的话,我非常乐意认识一下这个项目的负责人并且好好学习一次。 
  因此,这次测试也许会让一些JSP的支持者失望,PHP从速度角度来说,我认为完全可以接受其应用在各种Web项目中。当然,对于电子商务以及其他关键应用采用何种技术的话题,已经超过了本文的范畴,我在这里只想多阐述一些我的观点:毫无疑问Java技术已经成为了以上这些关键应用的事实技术标准,因为她的丰富内涵和相对简单的开发以及产品的强壮性都非常容易被我们所接受;而显然将PHP和Java技术在Web上的应用相比是毫无道理的、结果也是非常明显的,同样将PHP和JSP相比也只是不合适的--JSP在整个Java战略中只是算不上核心的一块,而PHP哪--只有PHP,完全PHP。不过作为LAMP的一分子,越来越受到重视的PHP在中小型项目以及非关键应用中的能力不容怀疑。

 redfox 回复于:2002-07-05 13:36:12
LAMP非常不错,呵呵呵呵呵。。。。。。。。

 yikexiaocao 回复于:2002-07-09 15:20:52
呵呵,有意思.
前不久俺也测过,不过简单多了.
俺的环境win2k,weblogic 6.1测jsp,apache+php4,apache+perl5.
我的测试很简单,就是hello world.
我的测试方法:打开页面后按住F5不放.然后在win带的任务管理器看性能.
测试结果:jsp启动要慢一些,php和perl的差不多.
F5结果:php和perl的内存占用有小幅度上升,然后趋于稳定,cpu占用率一路上升直到100%
jsp内存占用持续上升(上升很慢),cpu占用小幅度上升,到45-46%后趋于稳定.

俺的结论:这些东西是不同的优化的产物.呵呵~!~!~!.

俺的联想:jsp的优势在于大规模的应用,数据库连接方面,有良好的缓冲功能,宏观效益比较好,而且jsp的初始要求比较高(俺的烂机起weblogic起了2分钟才完全起来),对于jsp的应用,最好是大内存.对于php的应用最好是快的cpu.
呵呵,如果银子不成问题,大内存加快cpu更好.

不过,俺觉得这有点比较贝利和马拉多纳,大站点,企业应用,最好用jsp.小的东西吗,php就搞定了.


 redfox 回复于:2002-07-09 19:32:31
jsp开发周期长,代码冗长。php也可以用zend的一些辅助工具来缓冲加速,http://www.zend.com/ ,成倍的提高效率。

 收到 回复于:2002-07-15 20:50:21
JSP要快些

 安生网 回复于:2002-07-26 22:28:04
一直在用PHP

 不帅的花花 回复于:2002-11-18 09:33:10
[这个贴子最后由不帅的花花在 2002/11/18 09:34am 编辑]

to :yikexiaocao
JSP在第一次执行的时候当然是比较慢,因为它需要编译成servlet文件。
你按F5的效果就是让它编译再编译。这是不公平的。
在一个系统中,JSP文件的重新编译只有JSP文件第一次运行或者发生文件
改变的时候才发生。
在真正的应用中,weblogic一经启动以后就很少关闭的,而且所运行的
机器也非你所用的开发机可比。right?~
to eclipse 
在数据库连接问题中,不知道文章作者所用到的驱动是第几类驱动程序,
还是直接使用JDBC-ODBC连接桥,如果是后者的话,那当然是比较慢了,
建议你下载一个第四类驱动来再测试看看,绝对不是作者所说的速度。
呵呵。

 zcg 回复于:2003-02-18 14:27:06
哈!!

 fengzehao 回复于:2003-02-18 14:39:16
MVC模式?? 是什么

我只知道 LMAP=linux+Mysql+Apache+php

 lidou 回复于:2003-03-16 13:05:33
MVC: Mode-View-Control
是软件工程开发的一种模式。即模式,视图,控制(流程)。
举个例子来说,我们三个人做一个网站,环境已架好。第一位老兄做最先的建模工作(看看设计模式),说白了,就是写一些class出来,他的代码就是class XX{ }的。即Mode。第二个老兄是搞页面和美工的,他的工作就是<html><head>...之类的,他的东东是给用户看到的,即视图,就如数据库的视图一样。而第三位老兄则是根据用户分析得出的流程图来写程序,他调用第一位老兄的class,来具体的实例化,将结果给第二位老兄,让它反馈给用户,即控制,它具体的工作代码就象是<?php ?>或者是<%jsp %>。

而总的说来,jsp在这方面确实比php做的好,因此在大型网站中用jsp开发要比php容易得多。

 rocklv 回复于:2003-03-16 17:45:46
可是以我浏览两种网站的经验来看

php可比jsp快多啦

 jbuilder7 回复于:2003-03-21 09:52:01
快与慢其实都是相对的,尤其在网络中,快与慢是由很多因素影响的.当然我这么说不是说大家做这样的实验不是没有意义啊.

 snowall 回复于:2003-03-22 19:46:04
不要以为谁执行速度快谁就好,其实在处理动态页面时,大部分时间不应该是在代码的执行,而更多的时间是花在数据的I/O上.而数据的I/O又与其驱动有很大的关系,所以呢,不要简单的说谁快谁慢.

 redfox 回复于:2003-03-22 22:53:53
的确很难比较。

 轩辕砍刀 回复于:2003-03-31 15:46:38
我一直用LMAP :o

 cirm22 回复于:2003-12-17 03:15:11
因为好奇,我做了上述的1000x1000的运算测试。
我的环境是:winxp(athlon1.2GHz), 384mb, php4.32, apache2。
1000x1000的运算平均花费 1.15秒。
10000x10000的运算平均花费 153.22秒。
虽然说,这个效率不是很高,但是上述的测试数据有些夸大了。

测试代码如下。有兴趣的朋友也可以测试一下。

<?php

function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}

$max=10000;
$time_start = getmicrotime();

for ($i=1;$i<$max;$i++)
{  for ($j=1;$j<$max;$j++)
{
}
}
$time_end = getmicrotime();
$time = $time_end - $time_start;

echo "$max x $max loop test in $time seconds";
?>

 diychen 回复于:2004-10-16 22:08:40
我的执行1000结果是:
1000 x 1000 loop test in 2.07718896866 seconds

 HonestQiao 回复于:2004-10-17 00:28:28
我用FAPM(http://w.yi.org/ftp/FAPM)
和 WAPM

 lekj 回复于:2004-10-17 20:48:10
win2k iis+php4
1000 x 1000 loop test in 0.65349102020264 seconds   isapi
10000 x 10000 loop test in 97.2684550285 seconds   cgi
10000 x 10000 loop test in 61.832793951 seconds   isapi

 jhsea3do 回复于:2004-10-17 22:59:33
这么老的帖子怎么被顶上来了?

一句话,喜欢就用,不喜欢就不用,比较要从多面来比较!

 level 回复于:2004-10-18 08:31:35
我个人觉得不应该把2者相提并论,因为2者产生的根源,目的就不一样
作用也就不一样...

议价之言......^_^

 wanna51 回复于:2004-10-18 13:12:44
1000 x 1000 loop test in 0.521915197372 seconds

 SATAND 回复于:2004-10-18 13:32:53
如果是jsp+class,我更推崇php+c/c++,说实话,不是很喜欢java的解析模式
当然,一家之言:感觉用php去运算 X * X  loop 是不对的,也是没有必要的,即便是需要比如抽奖的随机与控制,也应当调用daemon而不是直接用php
如果非要比较两者的效率问题,应当引入c/c++扩展,当然,不用比较,因为单单是java需要一个解析器,就已经失败了

 longnetpro 回复于:2004-10-18 15:36:12
咳!这种比较不能说明任何问题。这个测试的先决条件就有问题。

虽然PHP与JSP都是解析执行,但PHP解析器与JAVA解析器有一个很大的不同,就是在运算方面,PHP解析器是按语句逐条运行及计算的,而JAVA则是先优化运算再执行的——这个差别可不是一点两点了,比如说一个很大的循环,PHP就得真的一个一个循环下去,而JAVA却可以先优化成高效中间代码再解析的。如果在JAVA中你对数学运算都用类来操作而不是直接用简单计算,JAVA的运算性能就会急剧下降,除了类本身的原因导致的,其实主要的是因为JAVA解析器对类的优化不如对纯运算优化来得容易及彻底。因此LOOP中的到底是什么样运算的就与测试结果有很大的关系。不妨测试在循环中包含函数调用,这个函数中只有简单运算,可能会发现两者差距会比较小了。固然JSP会快一些,但也不至于象楼主提到的有那么大的差距。因此我认为那些测试明显只是表面现象。另外还有一点要说明的是,PHP运行在进程模式下,而JSP运行在线程模式下,在这点上JSP已经就占了便宜。

而所说的所谓对数据库运算操作的比较测试,其实比较的并不是PHP及JSP本身的运算能力,而是数据库的运算能力及它们存取数据库的能力,主要是看这些语言与数据库连接及使用底层API的过程及能力。

 qingxia 回复于:2004-10-18 16:02:08
php+c  redhat 9.0 动态模块模式
10000*10000计算
0。86秒

cpu :p3 1g

 donyad 回复于:2005-08-01 13:42:09
[quote:395d7d6e7c="不帅的花花"]最后由不帅的花花在 2002/11/18 09:34am 编辑]

to :yikexiaocao
JSP在第一次执行的时候当然是比较慢,因为它需要编译成servlet文件。
你按F5的效果就是让它编译再编译。这是不公平的。
在一个系统中,JSP文件的重新..........[/quote:395d7d6e7c]

按F5就能让servlet重新编译么? ...... 兄台该补课了

 love100 回复于:2005-08-01 14:02:28
LAMP: 1000 x 1000 loop test in 0.41239094734192 seconds
           5000 x 5000 loop test in 10.366097927094 seconds

 clampox 回复于:2005-08-04 11:33:06
比如10万次A=A+1的循环
PHP是解释执行,循环10w次就固执地执行10w次,无论是否有意义。
而JSP则要“聪明”地编译一下,JSP会直接来个A=A+10w,根本不执行循环。

比较的时候要注意一下解释和编译执行的区别!

 laokan 回复于:2005-08-06 14:37:25
[quote:db091c8cdd="clampox"]比如10万次A=A+1的循环
PHP是解释执行,循环10w次就固执地执行10w次,无论是否有意义。
而JSP则要“聪明”地编译一下,JSP会直接来个A=A+10w,根本不执行循环。

比较的时候要注意一下解释和编译执行的区别![/quote:db091c8cdd]

 :em02:  :em02:

 evil_knight 回复于:2005-08-12 16:57:15
[quote:e59aaaa473="rocklv"]可是以我浏览两种网站的经验来看

php可比jsp快多啦[/quote:e59aaaa473]
是啊,我所浏览过的网站感觉,jsp的比php的慢很多,jsp快的网站我还真的没看到过,那位有,给个连接!

 sinox 回复于:2005-08-15 18:23:55
好文章就该顶!

原文转自:http://www.ltesting.net