您好,登錄后才能下訂單哦!
小編給大家分享一下PHP與JSP的性能測試比較,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
測試環(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.測試標(biāo)準(zhǔn)
循環(huán)N次,并做整型自加運(yùn)算。
b.測試代碼
測試結(jié)果(單位:毫秒)
測試結(jié)果說明:m-n表示主要波動范圍介于m和n之間;n表示出現(xiàn)次數(shù)非常之多的數(shù)值或平均值,m(x,y)表示偶爾會出現(xiàn)x,y。以下相同。
c.結(jié)論
Java的算術(shù)運(yùn)算,優(yōu)化得很好,估計(jì)是直接的對應(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ì)不是直接對應(yīng)機(jī)器碼的算術(shù)運(yùn)算。PHP算術(shù)運(yùn)算的過程猜測如下,在運(yùn)算前需要檢測變量是否是數(shù)值,并要將非數(shù)值轉(zhuǎn)換成數(shù)值,比如,PHP可以做這樣的運(yùn)算:100+"zhoutang",結(jié)果等于100.正是因?yàn)槭侨躅愋驼Z言,加上運(yùn)算前的檢測和轉(zhuǎn)換,所以才導(dǎo)致算術(shù)運(yùn)算的性能低下。PHP的單次運(yùn)算時(shí)間比較穩(wěn)定,大概每10000次算術(shù)加運(yùn)算花費(fèi)的時(shí)間約為3.5ms
不同的運(yùn)算方法,也對性能有影響。
二.字符串運(yùn)算
a.測試標(biāo)準(zhǔn)
字符串連接運(yùn)算對比。
b.測試
測試結(jié)果(單位:毫秒)
c.結(jié)論
Java的字符串是用對象處理,很明顯,在字符串的比較過程中,Java比PHP差很遠(yuǎn)。(因?yàn)樽址僮?,很大部分要做連接,這里只比較連接運(yùn)算,另外粗略比較了一下substring,兩者的差別不是很大)
PHP的字符串運(yùn)算,估計(jì)很多是直接調(diào)用C的字符串函數(shù),所以效率會高很多。在做Web開發(fā)中,字符串的連接操作還是很頻繁的(包括很多時(shí)候生成SQL字符串),所以,在算術(shù)運(yùn)算和字符串運(yùn)算兩個(gè)方面,Java(JSP)優(yōu)勢不明顯,與PHP各有所長。
三.數(shù)據(jù)庫查詢
a.測試標(biāo)準(zhǔn)
循環(huán)N次做數(shù)據(jù)庫打開,查詢,關(guān)閉操作。主要對JSP直接連數(shù)據(jù)庫,JSP連接池連數(shù)據(jù)訓(xùn),PHP直接連數(shù)據(jù)庫,PHP持久連數(shù)據(jù)庫做比較。
b.測試代碼
JSP String dbUrl, dbUser, dbPwd, strSQL; dbUrl = "jdbc:mysql://localhost:3306/zhoutang"; dbUser = "root"; dbPwd = ""; strSQL = "update tblUser set UserLC=UserLC+1 where UserID=100"; Class.forName("com.mysql.jdbc.Driver"); Connection con; Statement stmt; int i = 0; while (i < XXX) { con = DriverManager.getConnection(dbUrl,dbUser,dbPwd); stmt = con.createStatement(); stmt.executeUpdate(strSQL); stmt.close(); con.close(); stmt = null; con = null; i++; }
JSP連接池 Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql"); String strSQL = "update tblUser set UserLC=UserLC+1 where UserID=100"; Connection con; Statement stmt; int i = 0; while (i < XXXX) { con = ds.getConnection(); stmt = con.createStatement(); stmt.executeUpdate(strSQL); stmt.close(); con.close(); stmt = null; con = null; i++; }
PHP $dbHost = "localhost"; $dbUser = "root"; $dbPwd = ""; $dbName = "zhoutang"; $strSQL = "update tblUser set UserLC=UserLC+1 where UserID=100"; $i = 0; while ($i < XXXX) { $link = mysql_connect($dbHost, $dbUser, $dbPwd) or die('Could not connect: ' . mysql_error()); mysql_select_db($dbName); mysql_query($strSQL); mysql_close($link); $i++; }
PHP持久連接 $dbHost = "localhost"; $dbUser = "root"; $dbPwd = ""; $dbName = "zhoutang"; $strSQL = "update tblUser set UserLC=UserLC+1 where UserID=100"; $i=0; while ($i< XXXX) { $link = mysql_pconnect($dbHost, $dbUser, $dbPwd) or die('Could not connect: ' . mysql_error()); mysql_select_db($dbName); mysql_query($strSQL); mysql_close($link); $i++; }
測試結(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)體做比較)
四.文件操作
在Web開發(fā)過程上,文件操作一般不可缺少,大多數(shù)Web系統(tǒng)都會上傳或?qū)ξ募僮鳌?/p>
a.測試標(biāo)準(zhǔn)
綜合測試各種文件操作,測試的過程是首先判斷某文件是否存在,存在的話刪除文件,再新建文件,再往文件里寫一定長度的內(nèi)容。整個(gè)過程循環(huán)N次。
b.測試結(jié)果
JSP測試代碼: String fileName = "jsp.txt"; String filePath = request.getRealPath(""); int i = 0; int j = 0; while (i < XXXX) { File f = new File(filePath,fileName); if (f.exists()) { f.delete(); } f.createNewFile(); FileWriter fw = new FileWriter(filePath + File.separator + fileName); j = 0; while (j < 2 * i) { fw.write(j + "\r\n"); j++; } fw.close(); i++; }
PHP測試代碼: $fileName = "./php.txt"; $i = 0; while ($i < XXXX) { if (file_exists($fileName)) { unlink($fileName); } $handle = fopen($fileName, "x"); $j = 0; while ($j < 2 * $i) { fwrite($handle,$j."\r\n"); $j++; } fclose($handle); $i++; }
測試結(jié)果(單位:毫秒)
c.結(jié)論
這個(gè)測試結(jié)果有點(diǎn)意外,本以為PHP會大勝的項(xiàng)目,卻讓JSP***,循環(huán)次數(shù)大的時(shí)候,PHP比JSP慢一倍。有點(diǎn)不可思議。
五.總結(jié)
總體來說,PHP與JSP在性能上,差別不了很遠(yuǎn),各有優(yōu)勢。JSP雖是編譯執(zhí)行,但卻要通過JVM,性能會有所下降。從功能上說,JSP的相對強(qiáng)大一些,主要是因?yàn)橛蠮ava的支撐,在一些很大型的企業(yè)中,用JSP有優(yōu)勢(主要是有Java支撐),但一般的企業(yè)或一般的應(yīng)用,PHP完全可以應(yīng)付。另外,PHP比JSP更容易上手。另外,個(gè)人說為,做同樣的WEB系統(tǒng),PHP相對JSP來說,復(fù)雜度可能會低一些(JSP所有的技術(shù)都用上的話,估計(jì)架構(gòu)環(huán)境,系統(tǒng)設(shè)計(jì)都夠麻煩的,而且,Java體系各種技術(shù)和產(chǎn)品比較開放和松散,文檔相對來說有點(diǎn)雜亂,至少我認(rèn)為Tomcat的文檔做得沒有Apache,PHP的好。)。
PHP小巧而靈活,JSP就顯得寵大,而且,概念眾多,個(gè)人認(rèn)為Java體系有故意夸大技術(shù)復(fù)雜度的嫌疑。
此外,PHP還有Zend可用,本來想裝上Zend再來測試一番的,這幾天Zend的網(wǎng)站老是上不去。據(jù)有關(guān)測試表明,Zend能提升PHP的性能大約100%左右。也有說30-40%的,也有說600%的。估計(jì)是算術(shù)運(yùn)算能提升個(gè)檔次,其它操作,最多提升30-40%左右。
在整個(gè)測試過程中,每個(gè)取值我都會測多次,一般10s以下的運(yùn)算,我至少測10次,10s以上的運(yùn)算,至少測3次。PHP的測試結(jié)果都比較穩(wěn)定,每次測出的結(jié)果差別不是很大,從統(tǒng)計(jì)學(xué)的角度來說,方差比較小。JSP相對來說,偶爾會出現(xiàn)一些值,偏離平均值比較遠(yuǎn),而且,由于需要編譯的原因,***執(zhí)行一般時(shí)間比較長(雖然從程序里顯示的數(shù)值看不出***執(zhí)行的時(shí)間差距,但在程序開始執(zhí)行前,編譯需要點(diǎn)時(shí)間。編譯后才開始執(zhí)行,所以程序顯示的結(jié)果看不出來。),所以,JSP的測試,沒取***運(yùn)行的結(jié)果。
另外,在測試連接數(shù)據(jù)庫的過程中,由于一時(shí)疏忽,忘了在循環(huán)體內(nèi)i++,導(dǎo)致出現(xiàn)死循環(huán)。所以,也特意做了幾個(gè)死循環(huán)測試。算術(shù)運(yùn)算測試,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)能夠自動結(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)境簡單測試
以上數(shù)據(jù)只能做為參考,同樣的程序,在其它配置的系統(tǒng),我也做了簡單的測試:
I.p4 2.4G,512M DDR,Windows server2000的工作機(jī)
(安裝東西比較多,比較亂,運(yùn)行一年多沒重裝,由于是工作機(jī),所以操作系統(tǒng)對應(yīng)用程序優(yōu)化,而不是對后端服務(wù)優(yōu)化;所測得的數(shù)據(jù),比XP下測得的數(shù)據(jù)要大很多,比如PHP連接Mysql循環(huán)500次,大約需要16000ms。),粗略的測試的結(jié)果是:
算術(shù)運(yùn)算和字符串運(yùn)算:算術(shù)運(yùn)算,JSP領(lǐng)先很多,字符串運(yùn)算,PHP領(lǐng)先很多,和測試機(jī)的結(jié)果一致。
連接數(shù)據(jù)庫:PHP與JSP連Mysql速度差距不大,PHP大概快20%左右,奇怪的是我用pconnect連與connect是一樣的結(jié)果,未測試JSP的連接池。估計(jì)JSP用連接池會快很多。
文件操作:PHP的文件操作比JSP性能高出約30%!與測試機(jī)的結(jié)果有點(diǎn)相差比較大,PHP領(lǐng)先。
II.p4 2.66G,1G DDR,Linux服務(wù)器
算術(shù)運(yùn)算和字符串運(yùn)算:和其它環(huán)境測試結(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ǒng),測試結(jié)果表明,JSP和PHP在做Web開發(fā)時(shí),性能差距不大,只能說各有所長,JSP在數(shù)據(jù)庫操作以及字符串操作方面不如PHP,而PHP在文件操作及算術(shù)運(yùn)算是,不及JSP。
此外,同種語言,在不同的平臺表現(xiàn)也不一樣,根據(jù)我的測試結(jié)果表明,Linux下PHP,JSP的性能都要優(yōu)于Windows的。
七.運(yùn)行時(shí)間的獲取
JSP long timeStart = 0; long timeEnd = 0; timeStart = Calendar.getInstance().getTimeInMillis(); //中間代碼 timeEnd = Calendar.getInstance().getTimeInMillis(); out.println("開始時(shí)間:" + timeStart + "毫秒<br>"); out.println("結(jié)束時(shí)間:" + timeEnd + "毫秒<br>"); out.println("花費(fèi)時(shí)間:" + (timeEnd - timeStart) + "毫秒<br>");
PHP $timeStart = 0; $timeEnd = 0; $timeStart = mictime(); //中間代碼 $timeEnd = mictime(); echo "開始時(shí)間:".$timeStart."毫秒<br>"; echo "結(jié)束時(shí)間:".$timeEnd."毫秒<br>"; echo "花費(fèi)時(shí)間:".($timeEnd - $timeStart)."毫秒<br>"; function mictime() { //由于PHP支持不支持long型,所以,只取了5位秒數(shù),再加上毫秒。時(shí)間段比較,前面的可以忽略 list($usec, $sec) = explode(" ", microtime()); $sec = substr($sec, -5); $usec = ceil($usec * 1000); while (strlen($usec) < 3) { $usec="0".$usec; } return $sec.$usec; }
以上是“PHP與JSP的性能測試比較”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。