标题:[讨论]《ASP.NET、PHP、JSP的簡單比較》
只看楼主
geoger
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-17
 问题点数:0 回复次数:4 
[讨论]《ASP.NET、PHP、JSP的簡單比較》

一、前言

網頁開發平台比較常用的有ASP.NET、PHP和JSP,常用的數據庫有Oracle、MS SQL Server、MySQL,到底如何搭配才能取得最佳效果是開發人員關注的問題,本文在開發成本和性能上對幾種搭配作簡單比較,希望為小型企業和個人開發網站起到一點拋磚引玉的作用。

二、測試環境

首先介紹一下我使用的測試環境,ASP.NET的營運環境A如下︰

作業系統Windows 2003 Server
CPUK6II-350
內存256M
硬碟IBM-DPTA-372050 20G
主板EPOX MVP3G

這顯然是一個老掉牙的PC,但它還是比跑PHP和JSP的PC好一些,營運環境B如下︰

作業系統RedHat Linux 6.2(Kernel 2.2.24-6.2.3)
CPUK6II-350
內存128M
硬碟QUANTUM FIREBALL CX10.2A 10G
主板麒麟 MVP3

可以看出除內存差128M外,兩個營運環境硬體差別不大,微軟的程式要更耗內存,所以只好多給一些照顧。很多朋友關心的Windows下的PHP和JSP測試我沒有完成,因為我一直猜測PHP和JSP在Linux下的表現更為優秀。
數據庫也安裝在這兩台電腦上,Linux下安裝了Oracle 8.1.7和MySQL 5.0.1,Windows下安裝了SQL Server 2000 SP3。很自然,ASP.NET的合作伙伴是IIS,而PHP的拍檔是Apache 2.0.52,JSP容器我選用了Tomcat 5.5.5和Sun JDK 1.4.2。

三、測試目標和方法

測試目標︰

1.配置和修改程式的難易度。
2.運算速度(整型、浮點)。
3.數據庫操作IO性能。

測試方法︰

1.用完成這些小程式的過程來估計開發和部署成本。
2.用完成若干萬次浮點或整數加法的時間來說明運算性能。
3.用插入1000條記錄然後刪除的時間來說明數據庫性能。

四、編寫測試代碼

1.ASP.NET測試代碼

首先使用的是ASP.NET環境,VS.NET 2003作為開發工具已經安裝在我的筆記本電腦上,在製作測試項目時,選用了C#作為開發語言,使用ADO.NET進行數據庫操作。VS2003環境非常好用,可惜調試出了問題,系統總報錯“無法開始調試,Microsoft Ineternet Explorer無法找到”,幸好程式簡單不調試也可以。接著是一些討厭的權限問題又影響了工作進度,在正確的目錄設置了權限后,程式終于可以營運了。

下面為整數測試的部分代碼︰

DateTime startTime = DateTime.Now;
int addCount = int.Parse( Request.Form[ "loopCount" ] );
int result = 0;

for( int i = 0; i < addCount; i ++ )
{
result = 0;
for( int j = 0; j < addCount; j ++ )
result += j;
}

TimeSpan timeSpent = DateTime.Now - startTime;

以上代碼用一個兩重循環來計算整數加法,浮點數的加法測試程式與此類似。C#語言直觀清晰,微軟的.NET環境功能很強,很多東西可直接調用,比如計算時間差就非常簡單,然後測試數據庫性能,由於微軟.NET中不包含對MySQL的直接支持,從www.mysql.com下載了最新的ADO.Net Driver for MySQL,測試MySQL性能的代碼如下︰

DateTime startTime = DateTime.Now;

int insertCount = int.Parse( Request.Form[ "sqlNumber" ] );
Random ownerGen = new Random( (int)DateTime.Now.Ticks );
int ownerid = ownerGen.Next( int.MaxValue );

MySqlConnection conn =
new MySqlConnection
(
"database=test;server=10.1.1.9;ct Timeout=30;user id=test; pwd=test"
);
conn.Open();

MySqlTransaction testTrans;
testTrans = conn.BeginTransaction( IsolationLevel.ReadCommitted );

MySqlCommand cmd = conn.CreateCommand();

for( int i = 0; i < insertCount; i ++ )
{
cmd.CommandText =
"insert into fortest values ( " + ownerid.ToString() +", " + i.ToString() +
", 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' )";
cmd.ExecuteNonQuery();
}
testTrans.Commit();

cmd.CommandText = "delete from fortest where ownerid = " + owenerid.ToString();
cmd.ExecuteNonQuery();
cmd.Dispose();

conn.Close();

為了測試事務處理並加快插入速度,以上代碼程式將2000個插入操作放在了一個事務中,測試表用如下SQL創建︰

create table FORTEST
(
OWNERID INTEGER not null,
SERIALNUMBER INTEGER not null,
DATA VARCHAR(200)
)
alter table FORTEST
add primary key (OWNERID, SERIALNUMBER)

插入時ownerid隨機產生,以便測試並發性能。由於MySQL可以支持多種數據引擎,所以對兩種比較常用的引擎MyISAM和InnoDB都作了測試。
微軟.NET包含了SQL Server 2000的ADO.NET驅動和Oracle驅動,但測試Oracle時沒有使用微軟驅動而使用了Oracle自己的版本為9.2.0.4的ADO.NET驅動,因為微軟的驅動略顯陳舊。SQL Server和Oracle 測試代碼除了conn與cmd兩個變量使用的數據類型不同外,其他代碼與此完全相同,ADO.NET代碼在不同數據庫間有很好的可移植性。由於數據類型差異,Oracle、SQL Server 2000與MySQL的建表SQL略有不同。

搜索更多相关主题的帖子: NET JSP ASP PHP 
2006-10-28 19:56
geoger
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-17
得分:0 
2.建立PHP測試環境

PHP的測試環境建立在Linux + Apache上,加上MySQL就是大家熟知的“LAMP”,也許自由軟體真的是盞明燈,在這個功利至上的世界引導我們走向光明。下載了Apache 2.0.52和PHP 4.3.10的源代碼后,編譯、安裝和配置都很順利,開發PHP可用的集成環境也不少,最好的可能是Zend Studio,整個程式用Java開發,可以跨平台,但速度比較慢。
為了訪問MySQL、Oracle和MS SQL Server,還必須在Linux上安裝這些數據庫的客戶端,SQL Server 2000沒有官方的Linux客戶端,但可以使用一個叫FreeTDS的第三方產品連接SQL Server。

費了一番周折后,終于可以使用PHP進行測試了,下面是用PHP進行整數計算的測試代碼︰

$debug = new Debug;
$debug->startTimer();
$count = intval( $loopCount );
for( $j = intval( 0 ); $j < $count; $j ++ )
{
$result = intval( 0 );
for( $i = intval( 0 ); $i < $count; $i ++ )
{
$result += $i;
}
}

$totalTime = $debug->endTimer();

代碼量似乎比C#還小,但為了計算營運時間我不得不使用了一個Debug類,PHP提供的功能顯然沒有.NET豐富,下面是Debug類的代碼︰

class Debug
{
function startTimer()
{
global $starttime;
$mtime = microtime ();
$mtime = explode (' ', $mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;
}
function endTimer()
{
global $starttime;
$mtime = microtime ();
$mtime = explode (' ', $mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = round (($endtime - $starttime), 5);
return $totaltime;
}
}

PHP4只支持有限的面向對象功能,與微軟.NET的技術先進無法相比,但PHP是這三種開發平台中最簡單易學的。下面是PHP4訪問SQL Server 2000的代碼︰

$debug = new Debug;
$debug->startTimer();

mt_srand( make_seed() );
$owner = mt_rand();

$count = intval( $sqlNumber );
$result = intval( 0 );

$conn = @mssql_connect( 'fly', 'simon', '123456' );

for( $i = intval( 0 ); $i < $count; $i ++ )
{
$sql = "insert into fortest values ( $owner, $i," +
"'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' )";
mssql_query( $sql );
}

$sql = "delete from fortest where ownerid = $owner";
mssql_query( $sql );

$totalTime = $debug->endTimer();

echo "<h2>Micosoft SQL Server</h2><br/>\n";
echo "<h3>完成了".$sqlNumber."次insert操作。</h3><br/>\n";
echo "<h3>共耗時".$totalTime."秒!</h3>\n";

FreeTDS對SQL Server 2000事務支持的不好,提供的數據庫函數中沒有事務功能,只好使用最基本的操作。PHP4的另一個缺點是連接Oracle和MySQL時代碼差別很大,完全倚賴于數據庫的底層界面,這樣數據提取性能雖然有所體提升,但修改程式比較麻煩。

2006-10-28 19:57
MicroSoft
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:2
帖 子:499
专家分:3
注 册:2006-10-12
得分:0 
对繁体字不是很感冒

[glow=255,green,2]相信微软,相信我!~[/glow]
2006-10-28 19:57
geoger
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-17
得分:0 
3.建立JSP測試環境

由於Sun為JSP製訂了詳細的規範,所以滿足JSP規範的容器很多,此外JDK也有很多版本,我選用了相對最為簡單、用戶比較多的Tomcat 5.5.5作為JSP容器,JDK選用了1.4.2。為了調試程式方便,又在筆記本電腦上安裝了著名的eclipse 3.0和lmboz 3.0,先在筆記本上開發,然後再發布到Linux上測試。
Eclipse的配置比較繁瑣,尤其是和lmboz搭配使用時,很多細節不注意就不能達到預期目的,比如我為了在eclipse下實現JSP單步調試,足足折騰了兩天,現下可以了還是不明白為什麼可以。
總體感覺在eclipse下開發JSP還是挺爽的,但是機器配置要高,lvmboz有時行為很怪異,多試幾次才能解決問題。
下面是測試JSP整數性能的代碼︰

class Debug
{
private long startMs;

public void startTimer()
{
startMs = new java.util.Date().getTime();
}

public double endTimer()
{
return ( new java.util.Date().getTime() - startMs ) / 1000.0;
}
};

Debug db = new Debug();
db.startTimer();


int count = Integer.parseInt( request.getParameter( "loopCount" ) );
int result = 0;

for( int j = 0; j < count; j ++ )
{
result = 0;
for( int i = 0; i < count; i ++ )
{
result += i;
}
}

double totalTime = db.endTimer();

out.print( "<h2>Java</h2><br/>\n" );
out.print( "<h3>一共完成了" + count*count + "次整數加法。</h3><br/>\n" );
out.print( "<h3>運算結果是" + count + "個" + result+ "<h3><br/>\n" );
out.print( "<h3>共耗時" + totalTime + "秒!</h3>" );

總體感覺Java代碼比PHP要好些,但相對C#還是略顯繁瑣。為了測試數據庫性能,分別從Oracle、Microsoft、MySQL官方網站下載了最新的JDBC驅動,所有JDBC驅動都是直接訪問數據庫而不倚賴數據庫客戶端,下面是JSP訪問Oracle的代碼,其他數據庫測試代碼與此類似。

Debug db = new Debug();
db.startTimer();

Class.forName("oracle.jdbc.driver.OracleDriver".newInstance();

String server ="jdbcracle:thin:@10.1.1.9:1521:testdb";
String user = "test";
String password = "test";


int owner = ( int )( 20000000 * Math.random());

Connection conn= DriverManager.getConnection( server, user, password );
conn.setAutoCommit( false );

int count = Integer.parseInt( request.getParameter( "sqlNumber" ) );
String sql = "insert into fortest values( ?, ?," +
'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' )";
PreparedStatement pstmt = conn.prepareStatement( sql );

for( int i = 0; i < count; i ++ )
{
pstmt.setInt( 1, owner );
pstmt.setInt( 2, i );
pstmt.execute();
}

conn.commit();
pstmt.close();

PreparedStatement stmt = conn.prepareStatement( "delete from fortest where ownerid = ?" );
stmt.setInt( 1, owner );
stmt.execute();
conn.commit();

stmt.close();
conn.close();

double insertTime = db.endTimer();

out.print( "<h2>Oracle</h2><br/>" );
out.print( "<h3>完成了" + count + "次insert操作。</h3><br/>" );
out.print( "<h3>共耗時" + insertTime + "秒!</h3>" );

JDBC的數據庫操作代碼相當一致,而且都提供了事務支持,沒費什麼勁兒就調通了所有數據庫測試程式,幾乎是數據庫編程中最容易的。

4.開發環境易用度分析

總體來看,微軟提供了最好的桌面開發環境,VS2003不僅功能強大而且速度很快,特別是當用戶使用的數據庫是SQL Server時,優點更為突出,比如可以調試SQL。VS2003的使用和Windows的配置密切相關,有時會相當複雜,但文檔和線上幫助很豐富。
Eclispse和lvmboz的組合開發JSP感覺良好,雖然開始配置比較複雜。lvmboz安裝時需要注意很多細節,相關文檔比較缺乏。
PHP下的集成開發環境Zend Studio速度比較慢,功能簡單,安裝和配置都比較容易,但文檔最少。
從語言使用情況來看,C#最為簡潔,Java也很好,PHP相對較差。
優勝者當然是VS 2003,Eclipse也不錯。

2006-10-28 19:57
geoger
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2006-6-17
得分:0 
五、單用戶測試結果

單用戶測試是類比系統用戶非常少時,比如並發用戶只有一個的情況,這時系統有可能達到理論上的最佳性能。

1.整數運算測試結果

平台 執行整數加法次數 平均耗時
ASP.NET 4000000 0.07秒
JSP 4000000 0.08秒
PHP 4000000 39.80秒

2.浮點數運算測試結果

平台 執行浮點數加法次數 平均耗時
ASP.NET 4000000 0.15秒
JSP 4000000 0.207秒
PHP 4000000 36.20秒

3.MySQL測試結果(MyISAM引擎)

平台插入記錄數 平均耗時
PHP 2000 1.93秒
JSP 2000 2.00秒
ASP.NET 2000 3.22秒

4.MySQL測試結果(InnoDB引擎)

平台 插入記錄數 平均耗時
JSP 2000 2.26秒
ASP.NET 2000 3.33秒
PHP 2000 10.36秒

5.Oracle測試結果

平台 插入記錄數 平均耗時
JSP 2000 6.48秒
PHP 2000 13.35秒
ASP.NET 2000 14.10秒

6.MS SQL Server 2000測試結果

平台 插入記錄數 平均耗時
ASP.NET 2000 2.44秒
JSP 2000 2.69秒
PHP 2000 5.04秒

六、單用戶測試結果分析

PHP的速度只在連接MyISAM引擎時表現良好,除此之外幾乎一無是處,由於PHP是解釋執行而且變量無類型,這造成它的數值計算速度非常慢,附應時間是ASP.NET和JSP的數百倍。
千萬不要使用PHP進行複雜的數值計算,如果必須要這么做,最好使用PHP的自定義函數功能,用C實現函數后用PHP調用。
ASP.NET在其絕對速度上表現突出,在連接SQL Server 2000時性能優異。但連接Oracle速度很慢,很讓人費解,可能是驅動程式沒有優化所致,也可能是兩個巨頭在某些方面沒有達成一致意見。
JSP依靠其設計優秀的JDBC在數據庫操作上平均速度最快,訪問所有的數據庫代碼都無需修改,在數值計算能力上和ASP.NET的差別幾乎可以忽略不計,從這一點上來看,J2EE在企業中的地位很難動搖,何況在其背后還有這么多業界巨頭和自由開發者。

七、最後的優勝者

本文推薦幾個黃金組合,按使用成本從低到高如下︰

Linux + Apache + PHP + MySQL(MyISAM引擎)
這個組合在性價比上是當之無愧的王者,因為它的所有軟體均免費而且擁有最快的數據庫附應時間(1.93秒),相當穩定,很少有人聽說MySQL當機吧?這個組合入門很容易,這也是為什麼那么多初學人選用LAMP來做個人主頁的原因了。LAMP的缺點是事務處理能力弱,數值計算能力差,很不適合企業級計算,但對經常讀寫數據庫,又不需要事務處理的應用,比如論壇、辦公網、企業門戶網站等,它還是很勝任的。LAMP的入門要求是您必須有一名Linux系統管理員。

Windows 2003 + IIS + ASP.NET + SQL Server 2000
這個組合在開發成本上應該是最低的,因為它擁有最為強大的桌面集成環境,而且這套軟體微軟打包后價格不貴,支持的功能又特別多,特別適合中小型企業構造企業網站、辦公網、電子商務平台等。這個組合的最大風險來自Windows的病毒引起的維護成本,因為攻擊Windows的病毒實在太多,Windows系統的用戶必須相當小心才能使自己的平台不受攻擊。如果一個企業的擁有1到2名微軟認証的系統管理員,而且所有Windows都是正版,推薦使用這套配置。

Linux(Unix) + Apache + Tomcat(Jboss) + Oracle 10g
這個組合是專為中到大型企業資訊系統準備的,Oracle雖然對硬體要求較高但非常適海量數據的存儲,現下Oracle 10g安裝、配置、維護都很容易,Linux的使用也使Oracle成本大大下降。使用JBoss的主要原因是因為它免費,當然有錢也可以用Weblogic。大型企業中往往存在多個不同數據庫,分別存儲不同用途的數據,使用J2EE對其進行整合非常合適,可以很容易透過伺服器群集實現性能擴充,及時滿足企業客戶群不斷增加,市場不斷擴大的情況。這個組合的弱點是開發費用比較高,尤其是牽涉到J2EE的一些既高級又不太成熟的功能時,而且JDK的垃圾回收器一直做得不如.NET,在內存佔用和CPU佔用上都很嚇人。使用這個方案的企業必須有充裕的資金,長遠的資訊系統戰略,並且最好有自己的開發團隊。

2006-10-28 19:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-99387-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.413653 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved