|
筆者之前跟大家陳述過幾種增加伺服器效能的方法,像是減少Include的使用,使用不同的資料請求方法,但多是觀念性的東西,今天在國外看到一篇關於提昇ASP效能的文章,覺得蠻有趣的,決定將他翻譯出來跟大家分享,其中最有價值性的是這篇文章有許多數據加以佐證,讓大家更能從數據當中體驗效能的差異性。寫這篇文章的作者把這篇文章當成Part1,所以筆者在翻譯時也把它當成Part1來翻譯,Part2就看外國作者什麼時候出來囉,Part1的部分主要從幾點觀點做考量
在ASP程式當中穿插Html原始碼該注意的事項。
是否該將快取緩衝打開。
我是不是該減少沒有必要的註解文字。
程式頂端是否要指定預設的Script。
若沒有用到Session是否該將Session關掉。
使用 Option Explicit 對效能的影響。
使用副程式與函式該注意的事項。
使用Include所造成的衝擊。
當使用On Error Resume Next會造成多大的負擔。
針對SQL 的"需要異動要求"<%@ TRANSACTION = REQUIRED %>會有什麼樣的影響。
如同硬體測試一般,所有的測試數據都是透過微軟所設計的一套軟體Microsoft's Web Application Stress Tool (WAST)來完成,你可以到http://webtool.rte.microsoft.com/下載,不過支援的作業平台只有Windows NT 4.0和 Windows 2000,而且檔案大小高達9.58MB,有興趣的讀者可以載下來玩玩看,搞不好大家可以交流交流,至於這篇文章的外國作者他所使用的伺服器規格為Pentium 166 CPU搭配196 MB的記憶體,前端作業平台則是Pentium II 450搭配256MB的記憶體,大家會覺得說為什麼伺服器配備好像爛爛的,這一點作者也有提到,在測試時主要不是測試伺服器的效能,而是在測試伺服器處理一個網頁並將結果傳回前端的反應時間,使用的伺服器只是當作一個參考,當然啦!!越高階的伺服器,其反映時間越短這是一定的,現在就讓我們一一將測試結果呈現給各位。
1.在ASP程式當中穿插Html原始碼該注意的事項。
<% OPTION EXPLICIT
Dim FirstName
Dim LastName
Dim MiddleInitial
Dim Address
Dim City
Dim State
Dim PhoneNumber
Dim FaxNumber
Dim EMail
Dim BirthDate
FirstName = "John"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
City = "New York"
State = "NY"
PhoneNumber = "1-212-555-1234"
FaxNumber = "1-212-555-1234"
EMail = "john@public.com"
BirthDate = "1/1/1950"
%>
<HTML> <HEAD> <TITLE>Response Test</ TITLE > </HEAD> <BODY> <H1>Response Test</H1> <TABLE> <tr><td><b>First Name:</b></td><td><%= FirstName %></td></tr> <tr><td><b>Middle Initial:</b></td><td><%= MiddleInitial %></td></tr> <tr><td><b>Last Name:</b></td><td><%= LastName %></td></tr> <tr><td><b>Address:</b></td><td><%= Address %></td></tr> <tr><td><b>City:</b></td><td><%= City %></td></tr> <tr><td><b>State:</b></td><td><%= State %></td></tr> <tr><td><b>Phone Number:</b></td><td><%= PhoneNumber %></td></tr> <tr><td><b>Fax Number:</b></td><td><%= FaxNumber %></td></tr> <tr><td><b>EMail:</b></td><td><%= EMail %></td></tr> <tr><td><b>Birth Date:</b></td><td><%= BirthDate %></td></tr> </TABLE> </BODY> </HTML>
像<%=變數值%>這樣子的寫法是最多人用的,或許有人會這樣寫
<%Response.Write 變數值%>,但兩者執行結果一模一樣,惟前者在執行效率上會比
後者來的差,上面那一段程式經過測試的結果,其反應時間為8.28 msec
(千分之八點二八秒),我們將程式改寫成下面的形式(將所有的字串變數與Html碼以
Response.Write的方式來產生)
<% OPTION EXPLICIT
Dim FirstName
Dim LastName
Dim MiddleInitial
Dim Address
Dim City
Dim State
Dim PhoneNumber
Dim FaxNumber
Dim EMail
Dim BirthDate
FirstName = "John"
MiddleInitial = "Q"
LastName = "Public"
Address = "100 Main Street"
City = "New York"
State = "NY"
PhoneNumber = "1-212-555-1234"
FaxNumber = "1-212-555-1234"
EMail = "john@public.com"
BirthDate = "1/1/1950"
Response.Write("<html>")
Response.Write("<head>")
Response.Write(" <title>
Response Test</title>")
Response.Write("</head>")
Response.Write("<body>")
Response.Write("<h1>Response Test</h1>")
Response.Write("<table>")
Response.Write("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
Response.Write("<tr><td><b>Middle Initial:</b></td><td>" & MiddleInitial & "</td></tr>")
Response.Write("<tr><td><b>Last Name:</b></td><td>" & LastName & "</td></tr>")
Response.Write("<tr><td><b>Address:</b></td><td>" & Address & "</td></tr>")
Response.Write("<tr><td><b>City:</b></td><td>" & City & "</td></tr>")
Response.Write("<tr><td><b>State:</b></td><td>" & State & "</td></tr>")
Response.Write("<tr><td><b>Phone Number:</b></td><td>" & PhoneNumber & "</td></tr>")
Response.Write("<tr><td><b>Fax Number:</b></td><td>" & FaxNumber & "</td></tr>")
Response.Write("<tr><td><b>EMail:</b></td><td>" & EMail & "</td></tr>")
Response.Write("<tr><td><b>BirthDate:</b></td><td>" & BirthDate & "</td></tr>")
Response.Write("</table>")
Response.Write("</body>")
Response.Write("</html>")
%>
結果回應時間所短為8.08 msec, 比之前的程式快了 0.2 msec,加快了2.4%
,主要的原因在於將Html碼內嵌在Script中,伺服器在執行ASP時不需要在ASP標記
<%%>中切換來切換去,整體而言效能是提高了,但是卻增加了程式閱讀的困難性,而
且也拉長了開發程式的時間 。如果我們把所有的Response.Write精簡為只用一個
Response.Wrie來完成,如下所示,會有什麼結果呢 ?
結果回應時間所短為8.08 msec, 比之前的程式快了 0.2 msec,加快了2.4%
,主要的原因在於將Html碼內嵌在Script中,伺服器在執行ASP時不需要在ASP標記
<%%>中切換來切換去,整體而言效能是提高了,但是卻增加了程式閱讀的困難性,而
且也拉長了開發程式的時間 。如果我們把所有的Response.Write精簡為只用一個
Response.Wrie來完成,如下所示,會有什麼結果呢 ?
<%.............
Response.Write("<html>" & _
"<head>" & _
"<title>Response Test</title>" & _
"</head>" & _
"<body>" & _
"<h1>Response Test</h1>" & _
"<table>" & _
"<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>" & _
…............
"<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>" & _
"</table>" & _
"</body>" & _
"</html>")
%>
回應時間降低到 7.51 msec,又比上面的程式快了 0.57 msec,整體效能增加了 12.7%,這是因為減少了重複呼叫response.Write操作方法所導致的結果,可以看出這是最佳化之後的結果。最後讓我們看看以呼叫副程式的方式來完成上面的程式對整體效能有多大的影響:
<%............
writeCR("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
….......
SUB writeCR(str)
Response.Write(str & vbCRLF)
END SUB
%>
重複的呼叫WriteCR副程式來產生所需要的結果,跟第二個程式來做比較,我們發現反應時間從 8.08 msec 增加到 10.11 msec,總共增加了 2.03 msec,整體效能下降了 25.1%,最大的影響乃是重複的呼叫副程式所帶來的衝擊以及大量重複的vbcrlf(佔兩個byte)字元。
結論:
盡量減少程式在ASP標記<%%>中切換的次數。
減少使用Response.Write方法的次數。
降低vbCRLF字元出現的次數。
2.是否該將快取緩衝打開。
之前跟大家講過在 IIS4.0 中Response.Buffer的預設值是False的,如果使用者要將快取緩衝打開必須將 Response.Buffer 設定為 True ,或是透過IIS的設定來完成,來將快取緩衝打開會有什麼影響呢?你會發現伺服器在沒有將網頁完全處理完之前是不會將結果傳回客戶端的瀏覽器的,先讓我們看看第一種方式的執行結果:
<% OPTION EXPLICIT
Response.Buffer = true
Dim FirstName
..............
%>
反應時間跟前面最佳方式(7.05 msec)比起來加快了 0.97 msec(6.08 msec),整體效能提昇13.7%,但這已經是最佳效果了嗎?嘿嘿,看看另一種方式吧!將IIS MMC打開,在站台內容中選取主目錄選項,在應用程式選項中勾選啟用緩衝處理,結束 IIS MMC ,再執行相同的程式,結果如下:
反應時間: 5.57 msec (在往後的測試中,我們將把這個結果值當成基準值)
之前最快反應時間: 7.05 msec
速度增快 1.48 msec,整體效能提昇 21%
看到了吧,這才是我們想要的結果,現在終於知道為什麼 IIS 5.0 要將 Response.Buffer 預設為開啟的,將緩衝打開唯一的缺點就是除非整個網頁處理完,否則使用者是無法看到任何結果的!!
結論:使用伺服器的設定來將快取緩衝打開(如果你具有伺服器的管理權),或使用ASP的
Response.Buffer=True(如果你是申請免費空間的話)來將快取緩衝打開,相信我,這
對你的伺服器有絕對的影響。
3.我是否該為我的 ASP程式加上註解。
基本上筆者在還沒有看過這篇文章之前,開發 ASP 程式從來不加註解,原因有二:
第一:我真的很懶,寫程式已經很煩了,要我寫一些有的沒的註解我覺得很累,而且我所開發的程式通常都不會有其他人插手,寫那些註解給誰看啊?我寫的程式只有我自己看的懂。
第二:害怕所開發的程式容量過大,傳回客戶端時間會拉長,如今看來這一切顧慮都是多餘的,請看下面的測試結果你就知道我為什麼這麼說了。
<% OPTION EXPLICIT
'-------------------------------------------------------------------------------
… 20 行的註解,每行80個字元 …
'-------------------------------------------------------------------------------
Dim FirstName
.................
%>
基準值 = 5.57 msec
測試結果 = 5.58 msec
速度減低 0.01 msec,整體效能下降 0.1%,看到這樣的結果你一定很驚訝吧!!,因為伺服器在執行ASP程式時是不會將註解考慮在內的,所以啦,如果你想讓程式容易閱讀與除錯的話那麼就盡量加註解吧!!
4.程式頂端是否要指定預設的Script。
在 IIS 中系統指定 VBScript為預設的Script,那如果我們在程式開頭指定程式所用的 Script會有什麼影響呢?
<%@ LANGUAGE=VBSCRIPT %>
<% OPTION EXPLICIT
Dim FirstName
….....
%>
基準值 = 5.57 msec
測試結果 = 5.64 msec
速度減低 0.07 msec,整體效能下降 1.2%,很明顯的在程式開頭宣告 Script 是會造成效能上的影響的。
結論:除非你要使用不同的 Script 來撰寫 ASP,否則沒有必要在程式開頭宣告程式所用 的 Script 。
5.若沒有用到Session是否該將Session關掉。
在這個範例中我們假設沒有使用到 Session,並且在程式一開頭將 Session Disable 掉
<%@ ENABLESESSIONSTATE = FALSE %>
<% OPTION EXPLICIT
Dim FirstName
…....
%>
基準值 = 5.57 msec
測試結果 = 5.46 msec
速度加快 0.11 msec,整體效能提昇 2.0%
那麼如果我們透過 IIS MMC 來將 Session 關掉會有什麼影響呢?開啟 Internet 管理員,選取站台,按滑鼠右鍵點選內容,選擇主目錄選項,在應用程式項中按設定,然後在應用程式選項中將啟用作業狀態取消勾選,我們看看有什麼影響:
基準值 = 5.57 msec
測試結果 = 5.14 msec
速度加快 0.43 msec,整體效能提昇 7.7%,這是多麼大的效能提昇啊!!
結論:如果你確定不會用到任何的 Session 的話,請在程式一開頭或透過系統設定將
Session 狀態關閉。
6.使用 Option Explicit 對效能的影響。
一但你在程式開頭使用了 Option Explicit , 那麼在往後的程式段中若有使用到變數你就必須宣告一個變數名稱給指定的變數,通常會使用 Option Explicit 主要有兩個原因,一是他讓你在變數的控制存取上速度加快,其二是避免你宣告錯誤的變數名稱,讓我們看看將 Option Explicit 從程式開頭移除掉會有什麼影響:
基準值 = 5.57 msec
測試結果 = 6.12 msec
速度減低 0.55 msec,整體效能下降 9.8%,看來影響似乎蠻大的。
結論:請在程式一開頭使用 Option Explicit 。
7.使用副程式與函式該注意的事項。
如果我們使用副程式來產生上面的結果(在副程式中先不使用宣告變數的方法)
<%......
CALL writeTable()
SUB writeTable()
Response.Write("<html>" & _
"<head>" & _
…
"<tr><td><b>EMail:</b></td><td>" & EMail & "</td></tr>" & _
"<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>" & _
"</table>" & _
"</body>" & _
"</html>")
END SUB
......
%>
基準值 = 5.57 msec
測試結果 = 6.02 msec
速度減低 0.45 msec,整體效能下降 8.1%,再看看若將變數宣告加在副程式中會有什麼結果產生:
<% OPTION EXPLICIT
CALL writeTable()
SUB writeTable()
Dim FirstName
…
Dim BirthDate
FirstName = "John"
…
BirthDate = "1/1/1950"
Response.Write("<html>" & _
"<head>" & _
" <title>Response Test</title>" & _
"</head>" & _
"<body>" & _
"<h1>Response Test</h1>" & _
"<table>" & _
"<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>" & _
…
"<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>" & _
"</table>" & _
"</body>" & _
"</html>")
END SUB
%>
基準值 = 5.57 msec
測試結果 = 5.22 msec
速度加快 0.35 msec,整體效能提昇 6.3%,乾瞴影,你相信嗎?看到這個結果真令人驚訝,原來宣告變數的方法對效能有這麼大的影響,即使使用副程式也無所謂!
結論:當在程式中須不斷重複使用某一節段時才使用副程式,在使用副程式時請將變數宣告
在副程式中。
8.使用 Include File 對效能的影響。
我們將部分的程式段放進 Inc1.asp 中,然後再將他 Include 進來,看會有什麼影響!!
<% OPTION EXPLICIT
Dim FirstName
…
Dim BirthDate
FirstName = "John"
…
BirthDate = "1/1/1950"
%>
<!-- #include file="inc1.asp" -->
基準值 = 5.57 msec
測試結果 = 5.93 msec
速度減低 0.36 msec,整體效能下降 6.5%,影響算是蠻嚴重的,如果我們把副程式放到 Inc1.asp 中,再將他 Include 進來,然後在主程式中呼叫 Inc1.asp中的副程式看看會有什麼結果:
<% OPTION EXPLICIT
Dim FirstName
…
Dim BirthDate
FirstName = "John"
…
BirthDate = "1/1/1950"
CALL writeTable()
%>
<!-- #include file="inc1.asp" -->
基準值 = 5.57 msec
測試結果 = 6.08 msec
速度減低 0.51 msec,整體效能下降 9.2%,效能又比之前的差了一些。
結論:除非有多個檔案要分享同一個程式,否則盡量不要使用 Include。
9.當使用錯誤控制 (On Error Resume Next) 會造成多大的負擔。
<% OPTION EXPLICIT
On Error Resume Next
Dim FirstName
.........
%>
基準值 = 5.57 msec
測試結果 = 5.67 msec
速度減低 0.10 msec,整體效能下降 1.0%,使用錯誤控制的確需要花到一點代價,所以結論是:除非你是使用 COM 物件來存取系統資源或是使用到 FileSystem 物件,否則所有的錯誤都是可以控制的,也就是說沒有必要使用到錯誤控制時就不要使用。
<%@ TRANSACTION = REQUIRED %>
<% OPTION EXPLICIT
Dim FirstName
…
10.針對SQL 的"需要異動要求"<%@ TRANSACTION = REQUIRED %>會有什麼樣的影響。
針對大型資料庫系統,例如 SQL 的 MSDTC,若是在程式開頭加上
<%@ TRANSACTION = REQUIRED %> 會不會對系統造成負擔呢?讓我們看看結果:
基準值 = 5.57 msec
測試結果 = 13.39 msec
速度減低 7.82 msec,整體效能下降 140.4%,這個影響太嚴重了,要如何避免呢?
結論:只有當多個執行緒要求同一個異動結果時才使用 TRANSACTION。
總結:
為了綜合以上的測試結果,作者特別將幾個誤示範放在同一個程式中來實現,程式開頭指定 Script ,使用錯誤控制,重複使用 Response.Write 方法,移除 OPTION EXPLICIT 等等...
<%@ LANGUAGE=VBSCRIPT %>
<%
On Error Resume Next
FirstName = "John"
…
BirthDate = "1/1/1950"
Response.Write("<html>")
Response.Write("<head>")
Response.Write(" <title>Response Test</title>")
Response.Write("</head>")
Response.Write("<body>")
Response.Write("<h1>Response Test</h1>")
Response.Write("<table>")
Response.Write("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>")
…
Response.Write("<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>")
Response.Write("</table>")
Response.Write("</body>")
Response.Write("</html>")
%>
基準值 = 5.57 msec
測試結果 = 8.85 msec
速度減低 3.28 msec,整體效能下降 58.9%,我相信這是大部分的人寫 ASP 最常用的格式,可是在效能上已經將近降低了一倍,如果你能將上面所介紹的方法銘記在心,我相信會有更多人願意上你的網站的。
現在再讓我們回顧一下這篇文章所陳述的幾個重點:
避免過量的使用 ASP 標記 <%%> 。
盡量減少使用 Response.Write 方法 。
利用伺服器的設定啟動緩衝處理.
不必在乎註解的多寡,因為他對效能幾乎沒有影響 。
除非你要使用不同的 Script 來撰寫 ASP,否則沒有必要在程式開頭宣告程式所用 的 Script 。
記得使用 OPTION EXPLICIT 。.
不需要用到 Session 時就將 Session 關閉 。
除非有多個檔案要分享同一個程式,否則盡量不要使用 Include。
當在程式中須不斷重複使用某一節段時才使用副程式,在使用副程式時請將變數宣告
在副程式中。
除非你是使用 COM 物件來存取系統資源或是使用到 FileSystem 物件,否則所有的錯誤都是可以控制的,也就是說沒有必要使用到錯誤控制時就不要使用。
只有當多個執行緒要求同一個異動結果時才使用 TRANSACTION。 |
|