自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PHP與JSP上演超詳細(xì)性能測(cè)試大PK

開發(fā) 前端 后端
文章對(duì)PHP與JSP的性能進(jìn)行了詳細(xì)的測(cè)試,總體來說,PHP與JSP在性能上,差別不了很遠(yuǎn),各有優(yōu)勢(shì)。JSP雖是編譯執(zhí)行,但卻要通過JVM,性能會(huì)有所下降。

在網(wǎng)上有多關(guān)于PHP與JSP的性能比較,有些結(jié)果表明PHP比JSP性能低了很多,本文將客觀的展現(xiàn)PHP與JSP的性能測(cè)試比較,且都為真實(shí)數(shù)據(jù)。當(dāng)然, 這里面并沒有包含.Net。

測(cè)試環(huán)境:

◆硬件:P4 2.4G,1G內(nèi)存

◆軟件:WindowsXP+Apache2.0.54+PHP4.4.0+Mysql4.1.14+Tomcat5.0.28

一.算術(shù)運(yùn)算

a.測(cè)試標(biāo)準(zhǔn)

循環(huán)N次,并做整型自加運(yùn)算。

b.測(cè)試代碼

測(cè)試代碼

測(cè)試結(jié)果(單位:毫秒)

 

測(cè)試結(jié)果

測(cè)試結(jié)果說明:m-n表示主要波動(dòng)范圍介于m和n之間;n表示出現(xiàn)次數(shù)非常之多的數(shù)值或平均值,m(x,y)表示偶爾會(huì)出現(xiàn)x,y。以下相同。

c.結(jié)論

Java的算術(shù)運(yùn)算,優(yōu)化得很好,估計(jì)是直接的對(duì)應(yīng)CPU的指令,數(shù)值再大,算術(shù)運(yùn)算性能都很平穩(wěn)。需要注意的是,long的運(yùn)算時(shí)間要比int的運(yùn)算時(shí)間要長一些(畢竟是32位的系統(tǒng)),所以,在無需用到long時(shí),盡量不要用long,而用int.

PHP是弱類型的變量,算術(shù)運(yùn)算很不盡人意,估計(jì)不是直接對(duì)應(yīng)機(jī)器碼的算術(shù)運(yùn)算。PHP算術(shù)運(yùn)算的過程猜測(cè)如下,在運(yùn)算前需要檢測(cè)變量是否是數(shù)值,并要將非數(shù)值轉(zhuǎn)換成數(shù)值,比如,PHP可以做這樣的運(yùn)算:100+"zhoutang",結(jié)果等于100.正是因?yàn)槭侨躅愋驼Z言,加上運(yùn)算前的檢測(cè)和轉(zhuǎn)換,所以才導(dǎo)致算術(shù)運(yùn)算的性能低下。PHP的單次運(yùn)算時(shí)間比較穩(wěn)定,大概每10000次算術(shù)加運(yùn)算花費(fèi)的時(shí)間約為3.5ms

不同的運(yùn)算方法,也對(duì)性能有影響。

二.字符串運(yùn)算

a.測(cè)試標(biāo)準(zhǔn)

字符串連接運(yùn)算對(duì)比。

b.測(cè)試

測(cè)試

測(cè)試結(jié)果(單位:毫秒)

測(cè)試結(jié)果

c.結(jié)論

Java的字符串是用對(duì)象處理,很明顯,在字符串的比較過程中,Java比PHP差很遠(yuǎn)。(因?yàn)樽址僮?,很大部分要做連接,這里只比較連接運(yùn)算,另外粗略比較了一下substring,兩者的差別不是很大)

PHP的字符串運(yùn)算,估計(jì)很多是直接調(diào)用C的字符串函數(shù),所以效率會(huì)高很多。在做Web開發(fā)中,字符串的連接操作還是很頻繁的(包括很多時(shí)候生成SQL字符串),所以,在算術(shù)運(yùn)算和字符串運(yùn)算兩個(gè)方面,Java(JSP)優(yōu)勢(shì)不明顯,與PHP各有所長。

#p#

三.數(shù)據(jù)庫查詢

a.測(cè)試標(biāo)準(zhǔn)

循環(huán)N次做數(shù)據(jù)庫打開,查詢,關(guān)閉操作。主要對(duì)JSP直接連數(shù)據(jù)庫,JSP連接池連數(shù)據(jù)訓(xùn),PHP直接連數(shù)據(jù)庫,PHP持久連數(shù)據(jù)庫做比較。

b.測(cè)試代碼

  1. JSP  
  2.  
  3. String dbUrl, dbUser, dbPwd, strSQL;  
  4. dbUrl = "jdbc:mysql://localhost:3306/zhoutang";  
  5. dbUser = "root";  
  6. dbPwd = "";  
  7. strSQL = "update tblUser set UserLC=UserLC+1 where UserID=100";   
  8. Class.forName("com.mysql.jdbc.Driver");  
  9. Connection con;  
  10. Statement stmt;  
  11.  
  12. int i = 0;  
  13. while (i < XXX) {  
  14.       con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);  
  15.       stmt = con.createStatement();  
  16.       stmt.executeUpdate(strSQL);  
  17.       stmt.close();  
  18.       con.close();  
  19.       stmt = null;  
  20.       con = null;  
  21.       i++;  

 

  1. JSP連接池   
  2.  
  3. Context ctx = new InitialContext();  
  4. DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql");   
  5. String strSQL = "update tblUser set UserLC=UserLC+1 where UserID=100";  
  6.  
  7. Connection con;  
  8. Statement stmt;  
  9.  
  10. int i = 0;  
  11. while (i < XXXX) {  
  12.       con = ds.getConnection();  
  13.       stmt = con.createStatement();  
  14.       stmt.executeUpdate(strSQL);  
  15.       stmt.close();  
  16.       con.close();  
  17.       stmt = null;  
  18.       con = null;  
  19.       i++;  
  1. PHP   
  2.  
  3. $dbHost = "localhost";  
  4. $dbUser = "root";  
  5. $dbPwd = "";  
  6. $dbName = "zhoutang";  
  7. $strSQL = "update tblUser set UserLC=UserLC+1 where UserID=100";   
  8. $i = 0;  
  9. while ($i < XXXX) {  
  10.       $link = mysql_connect($dbHost, $dbUser, $dbPwd) or die('Could not connect: ' . mysql_error());  
  11.       mysql_select_db($dbName);  
  12.       mysql_query($strSQL);  
  13.       mysql_close($link);  
  14.       $i++;  
  1. PHP持久連接   
  2.  
  3. $dbHost = "localhost";  
  4. $dbUser = "root";  
  5. $dbPwd = "";  
  6. $dbName = "zhoutang";  
  7. $strSQL = "update tblUser set UserLC=UserLC+1 where UserID=100";   
  8. $i=0;  
  9. while ($i< XXXX) {  
  10.       $link = mysql_pconnect($dbHost, $dbUser, $dbPwd) or die('Could not connect: ' . mysql_error());  
  11.       mysql_select_db($dbName);  
  12.       mysql_query($strSQL);  
  13.       mysql_close($link);  
  14.       $i++;  

測(cè)試結(jié)果(單位:毫秒)

測(cè)試結(jié)果

c.結(jié)論

普通連接,Java連Mysql的速度是要比PHP慢的一倍左右。Java使用連接池技術(shù),性能提升非常明顯。

PHP使用的持久連接(pconnect)性能即然相當(dāng)于Java的連接池,結(jié)果實(shí)在讓人不可思議,本來挺擔(dān)心PHP連數(shù)據(jù)庫的,因?yàn)闆]連接池可用,特意在網(wǎng)上找了一些資料,沒發(fā)現(xiàn)PHP可用的連接池,相關(guān)提法都很少,很多PHP程序員甚至沒聽過這概念,這樣的結(jié)果,確實(shí)讓我也大吃一驚。不過,話說回來,pconnect的原理,和連接池差不多的,都是程序關(guān)閉連接,但PHP并不真正關(guān)閉,再次打開時(shí),直接使用可用的連接。但是,PHP的實(shí)現(xiàn)確實(shí)比Java方便多了,只需加個(gè)字母,就輕易實(shí)現(xiàn),Java則麻煩一些,我配置Tomcat的連接池都費(fèi)了些時(shí)間,按官方文檔,在tomcat5.0.28下沒配置成功,在CSDN上面,也看到很多新手發(fā)出求救,很多配置不成功的,***自己摸索出來了,配置方法可參考我的Blog。

如果將連接數(shù)據(jù)庫和關(guān)閉數(shù)據(jù)庫的操作,移到循環(huán)外面,剛PHP和JSP的執(zhí)行時(shí)間都差不多,循環(huán)50次約16ms??梢?,數(shù)據(jù)庫操作中,打開連接是相當(dāng)耗資源的,其它操作,與語言差別不大。JSP在連接數(shù)據(jù)庫的時(shí)候,開銷比PHP大很多。(這里特意將打開數(shù)據(jù)庫操作放在循環(huán)體做比較)

#p#

四.文件操作

在Web開發(fā)過程上,文件操作一般不可缺少,大多數(shù)Web系統(tǒng)都會(huì)上傳或?qū)ξ募僮鳌?/p>

a.測(cè)試標(biāo)準(zhǔn)

綜合測(cè)試各種文件操作,測(cè)試的過程是首先判斷某文件是否存在,存在的話刪除文件,再新建文件,再往文件里寫一定長度的內(nèi)容。整個(gè)過程循環(huán)N次。

b.測(cè)試結(jié)果

  1. JSP測(cè)試代碼:  
  2.  
  3. String fileName = "jsp.txt";  
  4. String filePath = request.getRealPath("");   
  5. int i = 0;  
  6. int j = 0;  
  7. while (i < XXXX) {  
  8.       File f = new File(filePath,fileName);   
  9.       if (f.exists()) {   
  10.             f.delete();  
  11.       }  
  12.       f.createNewFile();  
  13.       FileWriter fw = new FileWriter(filePath + File.separator + fileName);  
  14.       j = 0;  
  15.       while (j < 2 * i) {  
  16.             fw.write(j + "\r\n");  
  17.             j++;  
  18.       }  
  19.       fw.close();  
  20.       i++;  
  1. PHP測(cè)試代碼:  
  2.  
  3. $fileName = "./php.txt";   
  4. $i = 0;  
  5. while ($i < XXXX) {  
  6.       if (file_exists($fileName)) {  
  7.             unlink($fileName);  
  8.       }  
  9.       $handle = fopen($fileName, "x");  
  10.       $j = 0;  
  11.       while ($j < 2 * $i) {  
  12.             fwrite($handle,$j."\r\n");  
  13.             $j++;  
  14.       }  
  15.       fclose($handle);  
  16.       $i++;  

測(cè)試結(jié)果(單位:毫秒)

測(cè)試結(jié)果

c.結(jié)論

這個(gè)測(cè)試結(jié)果有點(diǎn)意外,本以為PHP會(huì)大勝的項(xiàng)目,卻讓JSP***,循環(huán)次數(shù)大的時(shí)候,PHP比JSP慢一倍。有點(diǎn)不可思議。

五.總結(jié)

總體來說,PHP與JSP在性能上,差別不了很遠(yuǎn),各有優(yōu)勢(shì)。JSP雖是編譯執(zhí)行,但卻要通過JVM,性能會(huì)有所下降。從功能上說,JSP的相對(duì)強(qiáng)大一些,主要是因?yàn)橛蠮ava的支撐,在一些很大型的企業(yè)中,用JSP有優(yōu)勢(shì)(主要是有Java支撐),但一般的企業(yè)或一般的應(yīng)用,PHP完全可以應(yīng)付。另外,PHP比JSP更容易上手。另外,個(gè)人說為,做同樣的WEB系統(tǒng),PHP相對(duì)JSP來說,復(fù)雜度可能會(huì)低一些(JSP所有的技術(shù)都用上的話,估計(jì)架構(gòu)環(huán)境,系統(tǒng)設(shè)計(jì)都?jí)蚵闊┑模?,Java體系各種技術(shù)和產(chǎn)品比較開放和松散,文檔相對(duì)來說有點(diǎn)雜亂,至少我認(rèn)為Tomcat的文檔做得沒有Apache,PHP的好。)。

PHP小巧而靈活,JSP就顯得寵大,而且,概念眾多,個(gè)人認(rèn)為Java體系有故意夸大技術(shù)復(fù)雜度的嫌疑。

此外,PHP還有Zend可用,本來想裝上Zend再來測(cè)試一番的,這幾天Zend的網(wǎng)站老是上不去。據(jù)有關(guān)測(cè)試表明,Zend能提升PHP的性能大約100%左右。也有說30-40%的,也有說600%的。估計(jì)是算術(shù)運(yùn)算能提升個(gè)檔次,其它操作,最多提升30-40%左右。

在整個(gè)測(cè)試過程中,每個(gè)取值我都會(huì)測(cè)多次,一般10s以下的運(yùn)算,我至少測(cè)10次,10s以上的運(yùn)算,至少測(cè)3次。PHP的測(cè)試結(jié)果都比較穩(wěn)定,每次測(cè)出的結(jié)果差別不是很大,從統(tǒng)計(jì)學(xué)的角度來說,方差比較小。JSP相對(duì)來說,偶爾會(huì)出現(xiàn)一些值,偏離平均值比較遠(yuǎn),而且,由于需要編譯的原因,***執(zhí)行一般時(shí)間比較長(雖然從程序里顯示的數(shù)值看不出***執(zhí)行的時(shí)間差距,但在程序開始執(zhí)行前,編譯需要點(diǎn)時(shí)間。編譯后才開始執(zhí)行,所以程序顯示的結(jié)果看不出來。),所以,JSP的測(cè)試,沒取***運(yùn)行的結(jié)果。

另外,在測(cè)試連接數(shù)據(jù)庫的過程中,由于一時(shí)疏忽,忘了在循環(huán)體內(nèi)i++,導(dǎo)致出現(xiàn)死循環(huán)。所以,也特意做了幾個(gè)死循環(huán)測(cè)試。算術(shù)運(yùn)算測(cè)試,JSP死循環(huán)時(shí),瀏覽器點(diǎn)了停止按鈕,tomcat仍繼續(xù)執(zhí)行,CPU一直是100%,只有在任務(wù)管理器里停了tomcat,才得以停止死循環(huán);PHP算術(shù)運(yùn)算死循環(huán),由于php.ini里有設(shè)置程序執(zhí)行的最長時(shí)間和***內(nèi)存,所以,死循環(huán)能夠自動(dòng)結(jié)束。數(shù)據(jù)庫連接死循環(huán),JSP在循環(huán)大概900多次后,出現(xiàn)異常,報(bào)錯(cuò),提示無法連接;PHP循環(huán)1500次后,仍然沒有結(jié)束,只好在任務(wù)管理器里結(jié)束apache進(jìn)程(我的php.ini設(shè)置PHP最長執(zhí)行時(shí)間為300秒)。

六.其它環(huán)境簡單測(cè)試

以上數(shù)據(jù)只能做為參考,同樣的程序,在其它配置的系統(tǒng),我也做了簡單的測(cè)試:

I.p4 2.4G,512M DDR,Windows server2000的工作機(jī)

(安裝東西比較多,比較亂,運(yùn)行一年多沒重裝,由于是工作機(jī),所以操作系統(tǒng)對(duì)應(yīng)用程序優(yōu)化,而不是對(duì)后端服務(wù)優(yōu)化;所測(cè)得的數(shù)據(jù),比XP下測(cè)得的數(shù)據(jù)要大很多,比如PHP連接Mysql循環(huán)500次,大約需要16000ms。),粗略的測(cè)試的結(jié)果是:

算術(shù)運(yùn)算和字符串運(yùn)算:算術(shù)運(yùn)算,JSP領(lǐng)先很多,字符串運(yùn)算,PHP領(lǐng)先很多,和測(cè)試機(jī)的結(jié)果一致。

連接數(shù)據(jù)庫:PHP與JSP連Mysql速度差距不大,PHP大概快20%左右,奇怪的是我用pconnect連與connect是一樣的結(jié)果,未測(cè)試JSP的連接池。估計(jì)JSP用連接池會(huì)快很多。

文件操作:PHP的文件操作比JSP性能高出約30%!與測(cè)試機(jī)的結(jié)果有點(diǎn)相差比較大,PHP領(lǐng)先。

II.p4 2.66G,1G DDR,Linux服務(wù)器

算術(shù)運(yùn)算和字符串運(yùn)算:和其它環(huán)境測(cè)試結(jié)果一致,JSP在算術(shù)運(yùn)算時(shí)領(lǐng)先,PHP在字符串運(yùn)算時(shí)領(lǐng)先很多很多。

連接數(shù)據(jù)庫:執(zhí)行500次循環(huán),PHP用connect連接,花費(fèi)185ms,PHP使用pconnect連接,花費(fèi)70ms;JSP未用連接池,花費(fèi)2030ms。

文件操作:JSP領(lǐng)先很多,1000次循環(huán),JSP花費(fèi)1500ms左右,PHP花費(fèi)7000ms左右。

III.總結(jié)

不管什么平臺(tái)系統(tǒng),測(cè)試結(jié)果表明,JSP和PHP在做Web開發(fā)時(shí),性能差距不大,只能說各有所長,JSP在數(shù)據(jù)庫操作以及字符串操作方面不如PHP,而PHP在文件操作及算術(shù)運(yùn)算是,不及JSP。

此外,同種語言,在不同的平臺(tái)表現(xiàn)也不一樣,根據(jù)我的測(cè)試結(jié)果表明,Linux下PHP,JSP的性能都要優(yōu)于Windows的。

七.運(yùn)行時(shí)間的獲取

 

  1. JSP  
  2.  
  3. long timeStart = 0;  
  4. long timeEnd = 0;  
  5. timeStart = Calendar.getInstance().getTimeInMillis();  
  6.  
  7. //中間代碼  
  8.  
  9. timeEnd = Calendar.getInstance().getTimeInMillis();  
  10. out.println("開始時(shí)間:" + timeStart + "毫秒<br>");  
  11. out.println("結(jié)束時(shí)間:" + timeEnd + "毫秒<br>");  
  12. out.println("花費(fèi)時(shí)間:" + (timeEnd - timeStart) + "毫秒<br>"); 

 

 

  1. PHP  
  2.  
  3. $timeStart = 0;  
  4. $timeEnd = 0;  
  5. $timeStart = mictime();  
  6.  
  7. //中間代碼  
  8.  
  9. $timeEnd = mictime();  
  10. echo "開始時(shí)間:".$timeStart."毫秒<br>";  
  11. echo "結(jié)束時(shí)間:".$timeEnd."毫秒<br>";  
  12. echo "花費(fèi)時(shí)間:".($timeEnd - $timeStart)."毫秒<br>";  
  13.  
  14. function mictime() {  
  15.       //由于PHP支持不支持long型,所以,只取了5位秒數(shù),再加上毫秒。時(shí)間段比較,前面的可以忽略  
  16.       list($usec, $sec) = explode(" ", microtime());  
  17.       $sec = substr($sec, -5);  
  18.       $usec = ceil($usec * 1000);  
  19.       while (strlen($usec) < 3) {  
  20.             $usec="0".$usec;  
  21.       }  
  22.       return $sec.$usec;  

原文鏈接:http://www.360doc.com/content/10/0514/20/2807_27615633.shtml

【編輯推薦】

  1. PHP將死,何以為繼?
  2. PHP資深開發(fā)者談:緣何放棄PHP改用Python 
  3. ASP.NET JSP PHP之間的取舍 
責(zé)任編輯:王曉東 來源: 360doc
相關(guān)推薦

2010-07-13 09:10:26

.NETMonoJava

2009-09-08 11:24:20

2022-04-29 09:33:58

PHP框架Laravel

2009-11-06 14:01:48

EPON接入技術(shù)

2019-05-21 09:40:47

Elasticsear高性能 API

2020-05-25 17:04:09

AMD云主機(jī)評(píng)測(cè)

2012-02-27 09:28:34

HadoopFourinone淘寶

2010-11-01 12:56:02

云計(jì)算高性能計(jì)算

2010-05-27 12:58:16

MySQL性能測(cè)試

2012-01-04 01:35:46

Power虛擬機(jī)x86性能大賽

2012-08-17 10:22:26

HTML5性能瀏覽器

2014-07-17 14:20:50

GDSF

2019-08-30 09:32:32

監(jiān)控負(fù)載測(cè)試工具

2009-07-01 18:24:59

JSP應(yīng)用程序JMeter

2015-10-28 13:30:15

PHP7性能揭秘

2013-07-31 16:56:08

系統(tǒng)級(jí)編程語言語言性能語言

2017-12-13 08:20:15

芯片驍龍?人工智能

2010-01-12 09:48:51

無線交換機(jī)

2023-04-14 07:18:24

RTX 4090Boost頻率
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)