一、前言
網頁開發平台比較常用的有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略有不同。