溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

PHP與JSP的性能測試比較

發(fā)布時(shí)間:2021-11-02 14:06:49 來源:億速云 閱讀:130 作者:小新 欄目:編程語言

小編給大家分享一下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.測試代碼

PHP與JSP的性能測試比較

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

PHP與JSP的性能測試比較

測試結(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.測試

PHP與JSP的性能測試比較

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

PHP與JSP的性能測試比較

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é)果(單位:毫秒)

PHP與JSP的性能測試比較

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é)果(單位:毫秒)

PHP與JSP的性能測試比較

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è)資訊頻道!

向AI問一下細(xì)節(jié)

免責(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)容。

AI