新微赢技术网

标题: [讨论]《ASP.NET、PHP、JSP的簡單比較》 [打印本页]

作者: 绝不放弃    时间: 2010-1-15 23:47
标题: [讨论]《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略有不同。
作者: …═☆幻    时间: 2010-1-15 23:47
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時代碼差別很大,完全倚賴于數據庫的底層界面,這樣數據提取性能雖然有所體提升,但修改程式比較麻煩。




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2