女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

當(dāng)前位置:首頁(yè) > > 充電吧
[導(dǎo)讀]引言 性能是一個(gè)特征。您必須預(yù)先設(shè)計(jì)性能,否則您以后就得重寫(xiě)應(yīng)用程序。就是說(shuō),有哪些好的策略可使 Active Server Pages (ASP) 應(yīng)用程序性能達(dá)到最佳? 本文介紹了優(yōu)化 ASP

引言

性能是一個(gè)特征。您必須預(yù)先設(shè)計(jì)性能,否則您以后就得重寫(xiě)應(yīng)用程序。就是說(shuō),有哪些好的策略可使 Active Server Pages (ASP) 應(yīng)用程序性能達(dá)到最佳?

本文介紹了優(yōu)化 ASP 應(yīng)用程序和 Visual Basic? Scripting Edition (VBScript) 的技巧。本文討論了許多陷阱。本文列出的建議已經(jīng)在 http://www.microsoft.com 和其它站點(diǎn)中進(jìn)行了測(cè)試,效果十分顯著。本文假定您已經(jīng)對(duì) ASP 開(kāi)發(fā),包括 VBScript 和/或 JScript、ASP Application、ASP Session 和其它 ASP 固有對(duì)象(Request、Response 和 Server)有了基本了解。

通常,ASP 性能主要取決于 ASP 代碼本身以外的很多因素。我們不在一篇文章中羅列出所有的信息,在本文結(jié)尾處我們列出了與性能有關(guān)的資源。這些鏈接涵蓋了 ASP 和非 ASP 主題,包括 ActiveX? 數(shù)據(jù)對(duì)象 (ADO)、組件對(duì)象模型 (COM)、數(shù)據(jù)庫(kù)和 Internet Information Server (IIS) 配置。這些都是我們喜歡的一些鏈接 - 一定要去看看。

技巧 1:將經(jīng)常使用的數(shù)據(jù)緩存在 Web 服務(wù)器上

典型的 ASP 頁(yè)從后端數(shù)據(jù)存儲(chǔ)中檢索數(shù)據(jù),然后將結(jié)果轉(zhuǎn)換成超文本標(biāo)記語(yǔ)言 (HTML)。無(wú)論數(shù)據(jù)庫(kù)的速度如何,從內(nèi)存中檢索數(shù)據(jù)總要比從后端數(shù)據(jù)存儲(chǔ)中檢索數(shù)據(jù)快得多。從本地硬盤(pán)讀取數(shù)據(jù)通常也比從數(shù)據(jù)庫(kù)中檢索數(shù)據(jù)更快。因此,通??梢詫?shù)據(jù)緩存在 Web 服務(wù)器上(存儲(chǔ)在內(nèi)存或磁盤(pán)中),來(lái)提高性能。

緩存是傳統(tǒng)的以空間換取時(shí)間的做法。如果您緩存的內(nèi)容正確,那么您可以看到性能會(huì)有顯著的提高。為使緩存有效,必須保存那些經(jīng)常重復(fù)使用的數(shù)據(jù),且要重新計(jì)算這些數(shù)據(jù)需要(適度)大的開(kāi)銷(xiāo)。如果緩存的都是些陳舊的數(shù)據(jù),就會(huì)造成內(nèi)存浪費(fèi)。

不經(jīng)常發(fā)生改變的數(shù)據(jù)是很好的緩存候選數(shù)據(jù),因?yàn)槟槐負(fù)?dān)心隨著時(shí)間的遷移該數(shù)據(jù)與數(shù)據(jù)庫(kù)同步的問(wèn)題。組合框列表、引用表、DHTML 碎片、擴(kuò)展標(biāo)記語(yǔ)言 (XML) 字符串、菜單項(xiàng)和站點(diǎn)配置變量(包括數(shù)據(jù)源名稱(chēng) (DSN)、Internet 協(xié)議 (IP) 地址和 Web 路徑)都是很好的緩存候選內(nèi)容。注意您可以緩存數(shù)據(jù)的“表示”,而不緩存數(shù)據(jù)本身。如果 ASP 頁(yè)很少更改,且緩存的開(kāi)銷(xiāo)也很大(例如,整個(gè)產(chǎn)品目錄),則應(yīng)考慮事先產(chǎn)生 HTML,而不是在響應(yīng)每個(gè)請(qǐng)求時(shí)重新顯示。

應(yīng)將數(shù)據(jù)緩存在哪里,有哪些緩存策略?通常,數(shù)據(jù)緩存在 Web 服務(wù)器的內(nèi)存或磁盤(pán)中。下兩個(gè)技巧講述了這兩個(gè)方法。

技巧 2: 將經(jīng)常使用的數(shù)據(jù)緩存在 Application 或 Session 對(duì)象中

ASP Application 和 Session 對(duì)象為將數(shù)據(jù)緩存在內(nèi)存中提供了方便的容器。您可以將數(shù)據(jù)指派到 Application 和 Session 對(duì)象中,這些數(shù)據(jù)在 HTTP 調(diào)用之間保留在內(nèi)存中。Session 數(shù)據(jù)是按每個(gè)用戶(hù)分別存儲(chǔ)的,而 Application 數(shù)據(jù)則在所有用戶(hù)之間共享。

什么時(shí)候?qū)?shù)據(jù)裝載到 Application 或 Session 中呢?通常,數(shù)據(jù)是在啟動(dòng) Application 或 Session 時(shí)裝載。要在 Application 或 Session 啟動(dòng)過(guò)程中裝載數(shù)據(jù),應(yīng)將適當(dāng)?shù)拇a分別添加到 Application_OnStart() 或 Session_OnStart() 中。這些函數(shù)應(yīng)在 Global.asa 中,如果沒(méi)有,則可以添加這些函數(shù)。還可以在第一次需要時(shí)裝載該數(shù)據(jù)。為此,在 ASP 頁(yè)中添加一些代碼(或編寫(xiě)一個(gè)可重復(fù)使用的腳本函數(shù)),以檢查數(shù)據(jù)是否存在,如果不存在,就裝載數(shù)據(jù)。這是一個(gè)傳統(tǒng)的性能技術(shù),稱(chēng)為“惰性計(jì)算” - 在您知道需要某一個(gè)值以前不計(jì)算該值。例如:

<%
Function GetEmploymentStatusList
Dim d
d = Application(?EmploymentStatusList?)
If d = ?? Then
' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()
Application(?EmploymentStatusList?) = d
End If
GetEmploymentStatusList = d
End Function
%>

可以為所需要的每個(gè)數(shù)據(jù)塊編寫(xiě)類(lèi)似的函數(shù)。

應(yīng)以什么格式存儲(chǔ)數(shù)據(jù)?可以存儲(chǔ)任何變體類(lèi)型,因?yàn)樗心_本變量都是變體型。例如,您可以存儲(chǔ)字符串、整數(shù)或數(shù)組。通常,您將以這些變量類(lèi)型之一存儲(chǔ) ADO 記錄集的內(nèi)容。要從 ADO 記錄集獲取數(shù)據(jù),您可以手工將數(shù)據(jù)復(fù)制到 VBScript 變量,一次一個(gè)字段。使用一個(gè) ADO 記錄集持久函數(shù) GetRows()、GetString() 或 Save()(ADO 2.5),可加快速度且更容易一些。其詳細(xì)情況已超出本文所討論的范圍,但下面給出了一個(gè)函數(shù)舉例,說(shuō)明使用 GetRows() 返回記錄集數(shù)據(jù)的一個(gè)數(shù)組:

' Get Recordset, return as an Array
Function FetchEmploymentStatusList
Dim rs
Set rs = CreateObject(?ADODB.Recordset?)
rs.Open ?select StatusName, StatusID from EmployeeStatus?, _
?dsn=employees;uid=sa;pwd=;?
FetchEmploymentStatusList = rs.GetRows() ? Return data as an Array
rs.Close
Set rs = Nothing
End Function

對(duì)上面舉例做更進(jìn)一步改進(jìn),可以將 HTML 緩存為列表,而不是數(shù)組。下面是簡(jiǎn)單的示例:

' Get Recordset, return as HTML Option list
Function FetchEmploymentStatusList
Dim rs, fldName, s
Set rs = CreateObject(?ADODB.Recordset?)
rs.Open ?select StatusName, StatusID from EmployeeStatus?, _
?dsn=employees;uid=sa;pwd=;?
s = ?? & vbCrLf
rs.Close
Set rs = Nothing ' See Release Early
FetchEmploymentStatusList = s ' Return data as a String
End Function

在適當(dāng)?shù)臈l件下,可以將 ADO 記錄集本身緩存在 Application 或 Session 作用域中。有兩個(gè)警告:

必須將 ADO 標(biāo)記為自由線程 必須使用斷開(kāi)連接的記錄集。

如果不能保證滿(mǎn)足這兩個(gè)要求,則不要緩存 ADO 記錄集。在下面的“非敏捷組件”和“不要緩存連接”技巧中,我們將討論將 COM 對(duì)象存儲(chǔ)在 Application 或 Session 作用域中的危險(xiǎn)性。

當(dāng)您將數(shù)據(jù)存儲(chǔ)在 Application 或 Session 作用域時(shí),數(shù)據(jù)將保留在那里,直到您以編程方式改變它、Session 過(guò)期或 Web 應(yīng)用程序重新啟動(dòng)為止。如果數(shù)據(jù)需要更新怎么辦?要手工強(qiáng)制對(duì) Application 數(shù)據(jù)進(jìn)行更新,您可以訪問(wèn)只有管理員才可訪問(wèn)的 ASP 頁(yè)來(lái)更新數(shù)據(jù)。或者,您可以通過(guò)函數(shù)定期自動(dòng)刷新數(shù)據(jù)。下面例子存儲(chǔ)帶有緩存數(shù)據(jù)的時(shí)間戳,并隔一段時(shí)間后刷新數(shù)據(jù)。

<%
' error handing not shown...
Const UPDATE_INTERVAL = 300 ' Refresh interval, in seconds

' Function to return the employment status list
Function GetEmploymentStatusList
UpdateEmploymentStatus
GetEmploymentStatusList = Application(?EmploymentStatusList?)
End Function

' Periodically update the cached data
Sub UpdateEmploymentStatusList
Dim d, strLastUpdate
strLastUpdate = Application(?LastUpdate?)
If (strLastUpdate = ??) Or _
(UPDATE_INTERVAL < DateDiff(?s?, strLastUpdate, Now)) Then

' Note: two or more calls might get in here. This is okay and will simply
' result in a few unnecessary fetches (there is a workaround for this)

' FetchEmploymentStatusList function (not shown)
' fetches data from DB, returns an Array
d = FetchEmploymentStatusList()

' Update the Application object. Use Application.Lock()
' to ensure consistent data
Application.Lock
Application(?EmploymentStatusList?) = Events
Application(?LastUpdate?) = CStr(Now)
Application.Unlock
End If
End Sub

請(qǐng)參見(jiàn) World's Fastest ListBox with Application Data,上面還有一個(gè)例子。

要知道在 Session 或 Application 對(duì)象中緩存大的數(shù)組不是一個(gè)好的做法。在訪問(wèn)數(shù)組的任何元素之前,腳本語(yǔ)言的語(yǔ)法要求必須臨時(shí)復(fù)制整個(gè)數(shù)組。例如,如果將由字符串組成的有 100,000 個(gè)元素的數(shù)組(該數(shù)組將美國(guó)郵政編碼映射到當(dāng)?shù)氐臍庀笳荆┚彺嬖?Application 對(duì)象中,ASP 必須先將所有的 100,000 個(gè)氣象站復(fù)制到臨時(shí)數(shù)組中,然后才能提取一個(gè)字符串。在這種情況下,用自定義方法建立一個(gè)自定義組件來(lái)存儲(chǔ)氣象站 - 或使用一個(gè)詞典組件會(huì)更好。

再警告大家一下,不要將嬰兒與洗澡水一起倒掉:數(shù)組能快速查尋和存儲(chǔ)在內(nèi)存中是鄰近的關(guān)鍵數(shù)據(jù)對(duì)。索引一個(gè)詞典比索引一個(gè)數(shù)組要慢得多。應(yīng)針對(duì)您的實(shí)際情況,選擇提供最佳性能的數(shù)據(jù)結(jié)構(gòu)。

技巧 3:將數(shù)據(jù)和 HTML 緩存在 Web 服務(wù)器的磁盤(pán)上

有時(shí),數(shù)據(jù)可能太多,無(wú)法都緩存在內(nèi)存中。“太多”只是一個(gè)說(shuō)法,這要看您想消耗多少內(nèi)存,以及需緩存的項(xiàng)目數(shù)和檢索這些項(xiàng)目的頻率。在任何情況下,如果數(shù)據(jù)太多而無(wú)法都緩存在內(nèi)存中,則考慮將數(shù)據(jù)以文本或 XML 文件緩存在 Web 服務(wù)器的硬盤(pán)上??梢酝瑫r(shí)將數(shù)據(jù)緩存在磁盤(pán)和內(nèi)存中,為您的站點(diǎn)建立最適宜的緩存策略。

注意當(dāng)測(cè)量單個(gè) ASP 頁(yè)的性能時(shí),檢索磁盤(pán)上的數(shù)據(jù)可能不一定要比從數(shù)據(jù)庫(kù)檢索數(shù)據(jù)更快。但緩存會(huì)降低數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)上的負(fù)載。在高負(fù)載的情況下,這樣做可大大改善總體吞吐量。當(dāng)緩存開(kāi)銷(xiāo)很大的查詢(xún)結(jié)果(如多表聯(lián)接或復(fù)合存儲(chǔ)過(guò)程)或大的結(jié)果集時(shí),這是非常有效的。與往常一樣,要測(cè)試一下幾種方案的優(yōu)劣。

ASP 和 COM 提供一些建立基于磁盤(pán)的緩存方案的工具。ADO 記錄集 Save() 和 Open() 函數(shù)保存和裝載磁盤(pán)中的記錄集??梢允褂眠@些方法重新編寫(xiě)上面 Application 數(shù)據(jù)緩存技巧中的代碼示例,用文件的 Save() 代替寫(xiě)到 Application 對(duì)象中的代碼。

有一些其它組件可以用于文件:

Scripting.FileSystemObject 可使您創(chuàng)建、讀和寫(xiě)文件。 與 Internet Explorer 一起提供的 Microsoft? XML 解析器 (MSXML) 支持保存和裝載 XML 文檔。 LookupTable 對(duì)象(例如,用在 MSN 上)是從磁盤(pán)裝載簡(jiǎn)單列表的最好選擇。

最后,應(yīng)考慮將數(shù)據(jù)的表示緩存在磁盤(pán)上,而不是數(shù)據(jù)本身。預(yù)先轉(zhuǎn)換的 HTML 可以用 .htm 或 .asp 文件存儲(chǔ)在磁盤(pán)上,超級(jí)鏈接可以直接指向這些文件??梢允褂蒙逃霉ぞ?,如 XBuilder,或 Microsoft? SQL Server? Internet 發(fā)布功能將產(chǎn)生 HTML 的過(guò)程自動(dòng)化?;蛘撸梢詫?HTML 代碼片斷放在 .asp 文件中。還可以使用 FileSystemObject 從磁盤(pán)讀取 HTML 文件,或使用 XML 盡早轉(zhuǎn)換。

技巧 4:避免將非敏捷的組件緩存在 Application 或 Session 對(duì)象中

盡管將數(shù)據(jù)緩存在 Application 或 Session 對(duì)象中是一個(gè)好的做法,但緩存 COM 對(duì)象卻有嚴(yán)重的陷阱。通常,人們傾向于將經(jīng)常使用的 COM 對(duì)象緩存到 Application 或 Session 對(duì)象中。很遺憾,許多 COM 對(duì)象(包括所有以 Visual Basic 6.0 或更低版本編寫(xiě)的對(duì)象)當(dāng)存儲(chǔ)在 Application 或 Session 對(duì)象時(shí),會(huì)引起嚴(yán)重的瓶頸。

具體來(lái)講,當(dāng)任何不敏捷的組件緩存在 Session 或 Application 對(duì)象時(shí),將引起性能瓶頸。敏捷的組件是被標(biāo)記為 ThreadingModel=Both 的組件,它聚集 Free-threaded marshaler (FTM);或被標(biāo)記為 ThreadingModel=Neutral 的組件。(Neutral 模型是 Windows? 2000 和 COM+ 的新增模型。) 下列組件不是敏捷的:

自由線程的組件(除非它們聚集 FTM)。 單元線程組件。 單線程組件。

配置的組件(Microsoft Transaction Server (MTS)/COM+ 庫(kù)和服務(wù)器程序包/應(yīng)用程序)不是敏捷的,除非它們是 Neutral 線程。單元線程組件和其它非敏捷的組件在頁(yè)作用域內(nèi)是最適合的(即,它們?cè)趩蝹€(gè) ASP 頁(yè)上創(chuàng)建和銷(xiāo)毀)。

在 IIS 4.0 中,被標(biāo)記為 ThreadingModel=Both 的組件被認(rèn)為是敏捷的。在 IIS 5.0 中,只有這一點(diǎn)還不夠。組件必須不僅被標(biāo)記 Both,還必須聚集 FTM。有關(guān)敏捷性的文章講述了如何使以 Active Template Library 編寫(xiě)的 C++ 組件聚集 FTM。要注意如果組件緩存界面指針,那么那些指針本身必須是敏捷的,或必須存儲(chǔ)在 COM 共用界面表 (GIT) 中。如果您不能重新編譯 Both 線程組件以聚集 FTM,那么您可以將組件標(biāo)記為 ThreadingModel=Neutral。或者,如果您不想讓 IIS 執(zhí)行敏捷性檢查(因此,您可以允許非敏捷的組件存儲(chǔ)在 Application 或 Session 作用域中),您可以在配置數(shù)據(jù)庫(kù)中將 AspTrackThreadingModel 設(shè)置為 True。不建議更改 AspTrackThreadingModel。

如果您想將以 Server.CreateObject 創(chuàng)建的非敏捷的組件存儲(chǔ)在 Application 對(duì)象中,IIS 5.0 將出現(xiàn)一個(gè)錯(cuò)誤。您可以在 Global.asa 中使用 避免這一錯(cuò)誤,但不建議這樣做,因?yàn)檫@會(huì)導(dǎo)致匯集和串行化,關(guān)于這一點(diǎn)將在下面講述。

如果您緩存非敏捷的組件會(huì)出現(xiàn)什么毛病?緩存在 Session 對(duì)象中的非敏捷的組件將 Session 鎖定于 ASP 工作者線程。ASP 維護(hù)一個(gè)工作者線程池來(lái)處理請(qǐng)求。通常情況下,一個(gè)新請(qǐng)求總是由第一個(gè)可用的工作者線程來(lái)處理。如果 Session 被鎖定于一個(gè)線程,那么請(qǐng)求必須等到其相關(guān)的線程可用為止。這里有一個(gè)類(lèi)比,也許會(huì)有所幫助:您去一家超級(jí)市場(chǎng),挑選了一些商品,并在 #_3 收款臺(tái)付款。其后,每當(dāng)您在那家超級(jí)市場(chǎng)為商品付款時(shí),您總是必須在 #_3 收款臺(tái)付款,即使其它收款臺(tái)前排隊(duì)的人較少或者沒(méi)有人排隊(duì),也是如此。

將非敏捷的組件存儲(chǔ)在 Application 作用域?qū)π阅艿挠绊懮踔粮鼔?。ASP 必須創(chuàng)建一個(gè)特殊的線程運(yùn)行存儲(chǔ)在 Application 作用域中的非敏捷組件。這會(huì)有兩個(gè)結(jié)果:所有調(diào)用都必須匯集到此線程,且所有調(diào)用都排成長(zhǎng)隊(duì)?!皡R集”的意思是參數(shù)必須存儲(chǔ)在內(nèi)存的共享區(qū)域;執(zhí)行一個(gè)開(kāi)銷(xiāo)很大的到特殊線程的上下文切換;執(zhí)行組件的方法;將結(jié)果匯集到共享區(qū)域;執(zhí)行另一個(gè)開(kāi)銷(xiāo)很大的上下文切換,將控制返回到原始的線程?!按谢币馑际侵该看沃贿\(yùn)行一個(gè)方法。兩個(gè)不同的 ASP 工作者線程不能同時(shí)在共享組件上執(zhí)行多個(gè)方法。這樣就杜絕了并發(fā)性,特別是在多處理器計(jì)算機(jī)上。更糟的是,所有非敏捷的 Application 作用域的組件共享一個(gè)線程(主機(jī) STA),因此串行化的影響甚至更顯著。

如之奈何?下面是一些一般的規(guī)則。如果您使用 Visual Basic (6.0) 或更早版本編寫(xiě)對(duì)象,那么不要將它們緩存在 Application 或 Session 對(duì)象中。如果您不知道對(duì)象的線程模型,不要緩存它。不要緩存非敏捷的對(duì)象,而應(yīng)在每個(gè)頁(yè)面創(chuàng)建和釋放它們。對(duì)象直接在 ASP 工作者線程上運(yùn)行,因此沒(méi)有匯集或串行化。如果 COM 對(duì)象在 IIS 服務(wù)器上運(yùn)行,且如果它們不花長(zhǎng)時(shí)間初始化和刪除,性能尚可。注意單線程對(duì)象不應(yīng)該這樣使用。小心 - VB 可創(chuàng)建單線程對(duì)象!如果您必須這樣使用單線程對(duì)象(如 Microsoft Excel 電子表格),別指望會(huì)有很高的吞吐量。

當(dāng) ADO 被標(biāo)記為自由線程,ADO 記錄集可以安全地緩存。要將 ADO 標(biāo)記為自由線程,使用 Makfre15.bat 文件,該文件通常位于目錄 //Program Files/Common/System/ADO 中。

警告 如果您使用 Microsoft Access 作為數(shù)據(jù)庫(kù),不應(yīng)將 ADO 標(biāo)記為自由線程的。ADO 記錄集也必須切斷連接。一般來(lái)說(shuō),如果您不能控制站點(diǎn)中的 ADO 配置(例如,您是一個(gè)獨(dú)立的軟件廠商 [ISV],向管理他們自己的配置客戶(hù)銷(xiāo)售 Web 應(yīng)用程序),最好不要緩存記錄集。

詞典組件也是敏捷的對(duì)象。LookupTable 從數(shù)據(jù)文件中裝載其數(shù)據(jù),可用于組合框數(shù)據(jù)和配置信息。Duwamish Books 中的 PageCache 對(duì)象可提供詞典語(yǔ)法,Caprock Dictionary 也可提供。這些對(duì)象或其派生對(duì)象可以構(gòu)成有效緩存策略的基礎(chǔ)。注意 Scripting.Dictionary 對(duì)象不是敏捷的,不應(yīng)該存儲(chǔ)在 Application 或 Session 作用域中。

技巧 5:不要將數(shù)據(jù)庫(kù)連接緩存在 Application 或 Session 對(duì)象中

緩存 ADO 連接通常是很糟糕的策略。如果一個(gè) Connection 對(duì)象存儲(chǔ)在 Application 對(duì)象中,并在所有的頁(yè)面中使用,那么所有頁(yè)面將爭(zhēng)搶這一連接。如果 Connection 對(duì)象存儲(chǔ)在 ASP Session 對(duì)象中,那么將為每個(gè)用戶(hù)創(chuàng)建數(shù)據(jù)庫(kù)連接。這就會(huì)使連接池的優(yōu)勢(shì)蕩然無(wú)存,并給 Web 服務(wù)器和數(shù)據(jù)庫(kù)帶來(lái)不必要的壓力。

可以不緩存數(shù)據(jù)庫(kù)連接,而是在使用 ADO 的每個(gè) ASP 頁(yè)面中創(chuàng)建和刪除 ADO 對(duì)象。這是很有效的,因?yàn)?IIS 內(nèi)嵌了數(shù)據(jù)庫(kù)連接池。更準(zhǔn)確地說(shuō),IIS 自動(dòng)啟用 OLEDB 和 ODBC 連接池。這就能確保在每個(gè)頁(yè)面上創(chuàng)建和刪除連接將是有效的。

因?yàn)檫B接的記錄集存儲(chǔ)一個(gè)到數(shù)據(jù)庫(kù)連接的引用,所以您不應(yīng)將連接的記錄集緩存在 Application 或 Session 對(duì)象中。但是,您可以安全地緩存斷開(kāi)連接的記錄集,它們不保存到其數(shù)據(jù)連接的引用。要斷開(kāi)記錄集連接,執(zhí)行下面的兩個(gè)步驟:

Set rs = Server.CreateObject(?ADODB.RecordSet?)
rs.CursorLocation = adUseClient ' step 1

' Populate the recordset with data
rs.Open strQuery, strProv

' Now disconnect the recordset from the data provider and data source
rs.ActiveConnection = Nothing ' step 2

有關(guān)連接池的更詳細(xì)信息,可以在 ADO 和 SQL Server 參考資料中找到。

技巧 6:合理地使用 Session 對(duì)象

既然我們已經(jīng)討論了緩存在 Application 和 Session 中的優(yōu)點(diǎn),現(xiàn)在開(kāi)始討論避免使用 Session 對(duì)象的問(wèn)題。正如下面所討論的,當(dāng)與忙的站點(diǎn)一起使用時(shí),Session 有幾個(gè)缺點(diǎn)?!懊Α钡囊馑家话闶侵敢幻腌娨髱装夙?yè)面或成千上萬(wàn)同時(shí)用戶(hù)的站點(diǎn)。這個(gè)技巧對(duì)于必須水平擴(kuò)展的站點(diǎn) - 即,那些利用多臺(tái)服務(wù)器以處理負(fù)載或?qū)崿F(xiàn)容錯(cuò)的站點(diǎn) - 甚至更重要。對(duì)于較小的站點(diǎn),諸如 Intranet 站點(diǎn),要想實(shí)現(xiàn) Session 帶來(lái)的方,必然增大系統(tǒng)開(kāi)銷(xiāo)。

簡(jiǎn)言之,ASP 自動(dòng)為每個(gè)訪問(wèn) Web 服務(wù)器的用戶(hù)創(chuàng)建一個(gè) Session。每個(gè) Session 大約需要 10 KB 的內(nèi)存開(kāi)銷(xiāo)(最主要的是數(shù)據(jù)存儲(chǔ)在 Session 中),這就使所有的請(qǐng)求都減慢。在配置的超時(shí)時(shí)段(通常是 20 分鐘)結(jié)束以前,Session 一直保留有效。

Session 的最大的問(wèn)題不是性能,而是可擴(kuò)展性。Session 不能跨越幾臺(tái) Web 服務(wù)器,一旦在一臺(tái)服務(wù)器上創(chuàng)建 Session,其數(shù)據(jù)就留在那兒。這就意味著如果您在一個(gè) Web 服務(wù)器群使用 Session,您必須設(shè)計(jì)一個(gè)策略,將每個(gè)用戶(hù)請(qǐng)求始終發(fā)到用戶(hù) Session 所在的那臺(tái)服務(wù)器上。這被稱(chēng)為將用戶(hù)“粘”在 Web 服務(wù)器上。術(shù)語(yǔ)“粘性會(huì)話”就是從這里派生而來(lái)的。如果 Web 服務(wù)器崩潰,被“粘住的”用戶(hù)將丟失他們的會(huì)話狀態(tài),因?yàn)闀?huì)話不是粘到磁盤(pán)上。

實(shí)現(xiàn)粘性會(huì)話的策略包括硬件和軟件解決方案。諸如 Windows 2000 Advanced Server 中的網(wǎng)絡(luò)負(fù)載平衡和 Cisco 的 Local Director 之類(lèi)的解決方案都可以實(shí)現(xiàn)粘性會(huì)話,代價(jià)是要損失一定程度的可擴(kuò)展性。這些解決方案是不完善的。不建議此時(shí)部署您自己的軟件解決方案(我們過(guò)去常常使用 ISAPI 篩選器和 URL 轉(zhuǎn)換等等)。

Application 對(duì)象也不跨越多臺(tái)服務(wù)器,如果您必須跨越 Web 服務(wù)器群共享和更新 Application 數(shù)據(jù),您必須使用后端數(shù)據(jù)庫(kù)。但是,只讀 Application 數(shù)據(jù)在 Web 服務(wù)器群中仍是有用的。

如果只是因?yàn)橐黾舆\(yùn)行時(shí)間(處理故障轉(zhuǎn)移和服務(wù)器維護(hù)),大多數(shù)關(guān)鍵任務(wù)站點(diǎn)至少需部署兩臺(tái) Web 服務(wù)器。因此,在設(shè)計(jì)關(guān)鍵任務(wù)應(yīng)用程序時(shí),必須實(shí)現(xiàn)“粘性會(huì)話”,或干脆避免使用 Session,以及任何其它將用戶(hù)狀態(tài)存儲(chǔ)在單個(gè) Web 服務(wù)器上的狀態(tài)管理技術(shù)。

如果您不使用 Session,一定要將它們關(guān)閉。您可以通過(guò) Internet Services Manager,為應(yīng)用程序執(zhí)行此操作(參見(jiàn) ISM 文檔)。如果您決定使用 Session,您可以采用一些方法減輕它們對(duì)性能的影響。

您可以將不需要 Session 的內(nèi)容(如幫助屏幕,訪問(wèn)者區(qū)域等等)移到另一個(gè)關(guān)閉了 Session 的 ASP 應(yīng)用程序中。您可以逐頁(yè)提示 ASP,您不再需要該頁(yè)面上的 Session 對(duì)象,使用以下放在 ASP 頁(yè)面最上面的指令:

<% @EnableSessionState=False %>

使用這一指令有一個(gè)很好的理由是,這些 Session 在框架集方面存在一個(gè)有意思的問(wèn)題。ASP 保證任何時(shí)候 Session 只有一個(gè)請(qǐng)求執(zhí)行。這樣就確保如果瀏覽器為一個(gè)用戶(hù)請(qǐng)求多個(gè)頁(yè)面,一次只有一個(gè) ASP 請(qǐng)求接觸 Session,這樣就避免了當(dāng)訪問(wèn) Session 對(duì)象時(shí)發(fā)生的多線程問(wèn)題。很遺憾,一個(gè)框架集中的所有頁(yè)面將以串行方式顯示,一個(gè)接一個(gè),而不是同時(shí)顯示。用戶(hù)可能必須等候很長(zhǎng)時(shí)間,才能看到所有的框架。該故事的寓意:如果某些框架集頁(yè)面不依靠 Session,一定要使用 @EnableSessionState=False 指令告訴 ASP。

有許多管理 Session 狀態(tài)的方法,可替代 Session 對(duì)象的使用。對(duì)于少量的狀態(tài)(少于 4 KB),我們通常建議使用 Cookies、QueryString 變量和隱式變量。對(duì)于更大數(shù)據(jù)量,如購(gòu)物小車(chē),后端數(shù)據(jù)庫(kù)是最適合的選擇。有關(guān) Web 服務(wù)器群中狀態(tài)管理技術(shù)的文章很多。有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn) Session 狀態(tài)參考資料。

技巧 7: 將代碼封裝在 COM 對(duì)象中

如果您有許多 VBScript 或 JScript,您可以經(jīng)常將代碼移到編譯的 COM 對(duì)象中,從而可改善性能。編譯的代碼通常比解釋的代碼運(yùn)行得更快。編譯的 COM 對(duì)象可以通過(guò)“早綁定”訪問(wèn)其它 COM 對(duì)象,與腳本使用的“晚綁定”相比,“早綁定”是調(diào)用 COM 對(duì)象的更有效方法。

將代碼封裝在 COM 對(duì)象中還有一些優(yōu)點(diǎn)(除性能之外):

COM 對(duì)象有利于將表示邏輯與業(yè)務(wù)邏輯分開(kāi)。 COM 對(duì)象可以保證代碼重復(fù)使用。 許多開(kāi)發(fā)人員發(fā)現(xiàn)以 VB、C++ 或 Visual J++ 編寫(xiě)的代碼比 ASP 更容易調(diào)試。

COM 對(duì)象也有缺點(diǎn),包括初始開(kāi)發(fā)時(shí)間和需要不同的程序設(shè)計(jì)技巧。注意封裝少量的 ASP 可能引起性能下降,而不會(huì)得到性能改進(jìn)。這種情況通常在少量的 ASP 代碼被封裝進(jìn) COM 對(duì)象時(shí)發(fā)生。在這種情況下,創(chuàng)建和調(diào)用 COM 對(duì)象的系統(tǒng)開(kāi)銷(xiāo)超過(guò)了編譯的代碼的優(yōu)點(diǎn)。應(yīng)反復(fù)地試驗(yàn),以確定什么樣的 ASP 腳本和 COM 對(duì)象代碼的組合產(chǎn)生最好的性能。注意,與 Microsoft Windows NT? 4.0/IIS 4.0 相比,Windows 2000/IIS 5.0 中在腳本和 ADO 性能方面有了很大的改進(jìn)。因此,隨著 IIS 5.0 的推出,編譯代碼比 ASP 代碼的性能優(yōu)勢(shì)有所降低。

有關(guān)在 ASP 中使用 COM 的優(yōu)點(diǎn)和缺點(diǎn)的詳細(xì)討論,參見(jiàn) ASP Component Guidelines and Programming Distributed Applications with and Microsoft Visual Basic 6.0。如果您部署 COM 組件,以負(fù)荷對(duì)它們進(jìn)行測(cè)試特別重要。事實(shí)上,理所當(dāng)然應(yīng)對(duì)所有的 ASP 應(yīng)用程序進(jìn)行負(fù)荷測(cè)試。

技巧 8:遲一點(diǎn)獲得資源,早一點(diǎn)釋放資源

這里是一個(gè)小技巧供您參考。一般來(lái)說(shuō),最好遲一點(diǎn)獲得資源,早一點(diǎn)釋放資源。這適用于 COM 對(duì)象以及文件句柄和其它資源。

這種優(yōu)化方法主要用于 ADO 連接和記錄集。當(dāng)您使用完記錄集,比方說(shuō)在顯示一個(gè)表及其數(shù)據(jù)之后,應(yīng)立即釋放它,而不是等到頁(yè)面結(jié)束時(shí)再釋放。將 VBScript 變量設(shè)置為 Nothing 是最好的做法。不要讓記錄集超出作用域之外。而且,要釋放任何相關(guān)的 Command 或 Connection 對(duì)象(在將記錄集或連接設(shè)置為 = Nothing 之前,不要忘記調(diào)用 Close())。這會(huì)縮短數(shù)據(jù)庫(kù)必須為您準(zhǔn)備資源的時(shí)間,并盡快釋放數(shù)據(jù)庫(kù)到連接池的連接。

技巧 9:進(jìn)程外執(zhí)行過(guò)程以性能換取可靠性

ASP 和 MTS/COM+ 兩者都有配置選項(xiàng),可使您兼顧可靠性和性能。當(dāng)建立和部署應(yīng)用程序時(shí),應(yīng)知道如何兼顧兩者的性能。

ASP 選項(xiàng)

可以配置 ASP 應(yīng)用程序,以便以三種方法之一運(yùn)行。在 IIS 5.0 中,引入了“隔離級(jí)”這一術(shù)語(yǔ)以說(shuō)明這些選項(xiàng)。這三個(gè)隔離級(jí)分別是低級(jí)、中級(jí)和高級(jí):

低級(jí)隔離。這在 IIS 的所有版本中都得到支持,且是最快的。它在 Inetinfo.exe 中運(yùn)行 ASP,Inetinfo.exe 是主要 IIS 進(jìn)程。如果 ASP 應(yīng)用程序崩潰,IIS 也會(huì)崩潰。(要在 IIS 4.0 下重新啟動(dòng) IIS,Web 站點(diǎn)管理員應(yīng)使用諸如 InetMon 之類(lèi)的工具監(jiān)視站點(diǎn),如果服務(wù)器發(fā)生故障,應(yīng)啟用批處理文件以重新啟動(dòng)服務(wù)器。IIS 5.0 引入了可靠的重新啟動(dòng),該方法可使發(fā)生故障的服務(wù)器自動(dòng)重新啟動(dòng)。) 中級(jí)隔離。IIS 5.0 引入了這個(gè)新的級(jí)別,它被稱(chēng)為進(jìn)程外級(jí)別,因?yàn)?ASP 在 IIS 進(jìn)程之外運(yùn)行。在中級(jí)隔離中,被配置作為中級(jí)隔離運(yùn)行的所有 ASP 應(yīng)用程序都共享一個(gè)進(jìn)程空間。這就減少了在一臺(tái)服務(wù)器運(yùn)行多個(gè)進(jìn)程外 ASP 應(yīng)用程序所需要的進(jìn)程數(shù)量。中級(jí)隔離是 IIS 5.0 中的默認(rèn)隔離級(jí)別。 高級(jí)隔離。在 IIS 4.0 和 IIS 5.0 中支持這一級(jí)別,高級(jí)隔離也是進(jìn)程外的。如果 ASP 崩潰,Web 服務(wù)器并不會(huì)崩潰。下次 ASP 請(qǐng)求時(shí),ASP 應(yīng)用程序就會(huì)自動(dòng)重新啟動(dòng)。在高級(jí)隔離中,配置作為高級(jí)隔離運(yùn)行的每個(gè) ASP 應(yīng)用程序都在其自有進(jìn)程空間中運(yùn)行。這樣做可保護(hù) ASP 應(yīng)用程序彼此之間不相互干擾。其缺點(diǎn)是它要求每個(gè) ASP 應(yīng)用程序都要有一個(gè)單獨(dú)的進(jìn)程。當(dāng)在一臺(tái)服務(wù)器上必須運(yùn)行許多應(yīng)用程序時(shí),系統(tǒng)開(kāi)銷(xiāo)就會(huì)大大增加。

哪個(gè)選項(xiàng)最好的呢?在 IIS 4.0 中,進(jìn)程外運(yùn)行將顯著降低性能。在 IIS 5.0 中,做了許多改進(jìn),將進(jìn)程外運(yùn)行 ASP 應(yīng)用程序所產(chǎn)生的開(kāi)銷(xiāo)降到最低限度。事實(shí)上,在絕大多數(shù)測(cè)試中,IIS 5.0 中的 ASP 進(jìn)程外應(yīng)用程序比 IIS 4.0 中的進(jìn)程內(nèi)應(yīng)用程序運(yùn)行得更快。不管怎樣,在兩個(gè)平臺(tái)上,進(jìn)程內(nèi)(低隔離級(jí))性能最佳。但是,如果訪問(wèn)率相對(duì)較低或最大吞吐量較低,低隔離級(jí)的優(yōu)勢(shì)不太明顯。因此,在您每一 Web 服務(wù)器每秒鐘需要數(shù)百或成千上萬(wàn)頁(yè)面時(shí),才會(huì)覺(jué)得有必要設(shè)置低隔離級(jí)。與往常一樣,應(yīng)對(duì)多種配置進(jìn)行測(cè)試,確定您要采取哪一種折衷方案。

注意 當(dāng)您運(yùn)行 ASP 進(jìn)程外應(yīng)用程序時(shí)(中級(jí)或高級(jí)隔離),它們?cè)?NT4 中的 MTS 和在 Windows 2000 中的 COM+ 中運(yùn)行。即,在 NT4 中它們?cè)?Mtx.exe 中運(yùn)行;而在 Windows 2000 中,它們?cè)?DllHost.exe 中運(yùn)行。您可以在任務(wù)管理器中看到這些進(jìn)程在運(yùn)行。您還可以看到 IIS 如何為進(jìn)程外 ASP 應(yīng)用程序配置 MTS 程序包或 COM+ 應(yīng)用程序。

COM 選項(xiàng)

COM 組件也有三種配置選項(xiàng),雖然與 ASP 選項(xiàng)不完全類(lèi)似。COM 組件可以是“未配置的”、配置為庫(kù)應(yīng)用程序或配置為服務(wù)器應(yīng)用程序?!拔磁渲玫摹币馑际侵附M件沒(méi)有注冊(cè) COM+。組件將在調(diào)用程序的進(jìn)程空間運(yùn)行,那就是說(shuō),它們是“進(jìn)程內(nèi)的”。庫(kù)應(yīng)用程序也是進(jìn)程內(nèi)的,但使用 COM+ 的服務(wù),包括安全、事務(wù)和上下文支持。服務(wù)器應(yīng)用程序被配置為在它們自有的進(jìn)程空間內(nèi)運(yùn)行。

您可以看到未配置的組件比庫(kù)應(yīng)用程序略有一些優(yōu)勢(shì)。庫(kù)應(yīng)用程序比服務(wù)器應(yīng)用程序的性能優(yōu)點(diǎn)更大。這是因?yàn)閹?kù)應(yīng)用程序與 ASP 在同一進(jìn)程內(nèi)運(yùn)行,而服務(wù)器應(yīng)用程序在它們的自有進(jìn)程內(nèi)運(yùn)行。進(jìn)程間的調(diào)用比進(jìn)程內(nèi)調(diào)用開(kāi)銷(xiāo)更大。而且,當(dāng)在進(jìn)程之間傳遞諸如記錄集之類(lèi)的數(shù)據(jù)時(shí),必須在兩個(gè)進(jìn)程之間復(fù)制所有的數(shù)據(jù)。

陷阱!當(dāng)使用 COM 服務(wù)器應(yīng)用程序時(shí),如果您在 ASP 和 COM 之間傳遞對(duì)象,要確保對(duì)象執(zhí)行“按值匯集”或 MBV。執(zhí)行 MBV 的對(duì)象將它們自己從一個(gè)進(jìn)程復(fù)制到另一個(gè)進(jìn)程。這比下面一種方法好,采用這種方法時(shí),對(duì)象仍在創(chuàng)建者的進(jìn)程中,另外一個(gè)進(jìn)程反復(fù)地調(diào)用創(chuàng)建進(jìn)程以使用該對(duì)象。切斷連接的 ADO 記錄集將“按值匯集”,連接的記錄集則不然。Scripting.Dictionary 不執(zhí)行 MBV,且不在進(jìn)程之間傳遞。最后,VB 程序員請(qǐng)注意:MBV 不通過(guò)傳遞參數(shù) ByVal 獲得。MBV 由原始的組件作者執(zhí)行。

怎么辦?

如果讓我們建議一個(gè)兼顧性能與可靠性的合理配置,它們應(yīng)是如下的配置:

在 IIS 4.0 中,使用 ASP 低隔離級(jí)別,使用 MTS 服務(wù)器程序包。 在 IIS 5.0 上,使用 ASP 的中隔離級(jí),并使用 COM+ 庫(kù)應(yīng)用程序。

這些是非常一般的原則,主機(jī)服務(wù)公司一般情況下以中或高隔離級(jí)運(yùn)行 ASP,而單用途的 Web 服務(wù)器可以以低隔離級(jí)運(yùn)行。衡量各種利弊,并自己決定哪個(gè)配置更能符合您的需要。

技巧 10:使用顯式選項(xiàng)

在 .asp 文件中應(yīng)使用 Option Explicit。此指令放在 .asp 文件的最上面,它強(qiáng)制開(kāi)發(fā)人員聲明要使用到的所有變量。許多程序員認(rèn)為這種方法對(duì)于調(diào)試應(yīng)用程序很有幫助,因?yàn)檫@種方法避免了鍵錯(cuò)變量名和誤建新變量的可能性(例如,將 MyXMLString=) 錯(cuò)寫(xiě)成 MyXLMString=...。

更重要的一點(diǎn)也許是,聲明的變量比未聲明的變量速度更快。由此,腳本在運(yùn)行時(shí)每次用到未聲明的變量時(shí),按名稱(chēng)引用它。另一方面,聲明的變量是有順序的,要么以編譯時(shí)間,要么以運(yùn)行時(shí)間。以后,聲明的變量都按此順序引用。因?yàn)?Option Explicit 強(qiáng)制變量聲明,它能確保聲明所有變量,因此訪問(wèn)的速度也很快。

技巧 11:在子例程和函數(shù)中使用局部變量

局部變量是那些在子例程和函數(shù)內(nèi)聲明的變量。在函數(shù)或子例程內(nèi),局部變量訪問(wèn)比全局變量訪問(wèn)更快。局部變量的使用也會(huì)使代碼更清晰,因此應(yīng)盡量使用局部變量。

技巧 12:將經(jīng)常使用的數(shù)據(jù)復(fù)制到腳本變量中

當(dāng)訪問(wèn) ASP 中的 COM 對(duì)象時(shí),應(yīng)將經(jīng)常使用的對(duì)象數(shù)據(jù)復(fù)制到腳本變量中。這樣做可減少 COM 方法調(diào)用,因?yàn)?COM 方法調(diào)用與訪問(wèn)腳本變量相比,開(kāi)銷(xiāo)相對(duì)較大。當(dāng)訪問(wèn) Collection 和 Dictionary 對(duì)象時(shí),這種技術(shù)也會(huì)減少開(kāi)銷(xiāo)很大的查找。

一般來(lái)說(shuō),如果您打算不止一次訪問(wèn)對(duì)象數(shù)據(jù),那么就應(yīng)將數(shù)據(jù)放到腳本變量中。這種優(yōu)化的主要目標(biāo)是 Request 變量(Form 和 QueryString 變量)。例如,您的站點(diǎn)可傳遞一個(gè)名為 UserID 的 QueryString 變量。假設(shè)此 UserID 在特定頁(yè)面上被引用 12 次??梢詿o(wú)須調(diào)用 Request(?UserID?) 12 次,而是在 ASP 頁(yè)面最上面將 UserID 指派到一個(gè)變量。然后在該頁(yè)面自始至終使用該變量。這樣就省去了 11 次 COM 方法調(diào)用。

實(shí)際上,訪問(wèn) COM 屬性或方法的開(kāi)銷(xiāo)并沒(méi)有那么大。下面舉一個(gè)例子,說(shuō)明某相當(dāng)常見(jiàn)的代碼(從語(yǔ)法上講):

Foo.bar.blah.baz = Foo.bar.blah.qaz(1)
If Foo.bar.blah.zaq = Foo.bar.blah.abc Then ' ...

當(dāng)此代碼運(yùn)行時(shí),下面是發(fā)生的情況:

變量 Foo 被解析為全局對(duì)象。 變量 bar 被解析為 Foo 的成員。這實(shí)際就是一次 COM 方法調(diào)用。 變量 blah 被解析為 Foo.bar 的成員。這又是一次 COM 方法調(diào)用。 變量 qaz 被解析為 foo.bar.blah 的成員。沒(méi)有錯(cuò),這還是一次 COM 方法調(diào)用。 調(diào)用 Foo.bar.blah.quaz(1)。再一次 COM 方法調(diào)用。懂了嗎? 再次執(zhí)行步驟 1 至步驟 3 以解析 baz。系統(tǒng)并不知道調(diào)用 qaz 是否改變對(duì)象模型,因此必須再次執(zhí)行步驟 1 至 3 以解析 baz。 將 baz 解析為 Foo.bar.blah 的成員。賦予屬性。 再次執(zhí)行步驟 1 至步驟 3 以解析 zaq。 再次執(zhí)行步驟 1 至步驟 3 以解析 abc。

正如您可看到的,效率相當(dāng)差(且慢)。以 VBScript 寫(xiě)此代碼的快速方法是:

Set myobj = Foo.bar.blah ' do the resolution of blah ONCE
Myobj.baz = myobj.qaz(1)
If Myobj.zaq = Myobj.abc Then '...

如果您使用 VBScript 5.0 或更高版本,您可以使用 With 語(yǔ)句寫(xiě)此代碼:

With Foo.bar.blah
.baz = .qaz(1)
If .zaq = .abc Then '...
...
End With

注意此技巧也適用于 VB 程序設(shè)計(jì)。

技巧 13:避免重新確定數(shù)組的維數(shù)

應(yīng)盡量避免 Redim 數(shù)組。就性能而言,如果計(jì)算機(jī)的物理內(nèi)存大小有限,最好將數(shù)組的初始維數(shù)設(shè)置為其最不利的情況 - 或?qū)⒕S數(shù)設(shè)置為其最佳的情況,然后再按需要重新確定維數(shù)。這并非意味著,如果知道您不需要內(nèi)存時(shí),就隨便分配幾兆字節(jié)的內(nèi)存。

下面的代碼給您顯示使用 Dim 和 Redim 不當(dāng)?shù)那樾巍?

<%
Dim MyArray()
Redim MyArray(2)
MyArray(0) = ?hello?
MyArray(1) = ?good-bye?
MyArray(2) = ?farewell?
...
' some other code where you end up needing more space happens, then ...
Redim Preserve MyArray(5)
MyArray(3) = ?more stuff?
MyArray(4) = ?even more stuff?
MyArray(5) = ?yet more stuff?
%>

最好一開(kāi)始就將數(shù)組的初始大小 Dim 正確(在本例中,是 5)比 Redim 數(shù)組使其更大好得多。您可能浪費(fèi)一些內(nèi)存(如果您沒(méi)有使用所有的元素),但獲得的好處是速度變得更快。

技巧 14:使用響應(yīng)緩沖

您可以通過(guò)啟用“響應(yīng)緩沖”,將要輸出的一整頁(yè)緩沖起來(lái)。這樣就將寫(xiě)到瀏覽器的量減到最少,從而改善總體性能。每個(gè)寫(xiě)操作都會(huì)產(chǎn)生很大的系統(tǒng)開(kāi)銷(xiāo)(在 IIS 中以及在通過(guò)網(wǎng)絡(luò)發(fā)送的數(shù)據(jù)量方面),因此寫(xiě)操作越少越好。由于其啟動(dòng)慢且使用 Nagling 算法(用來(lái)減輕網(wǎng)絡(luò)塞車(chē)情況),TCP/IP 在發(fā)送一些大的數(shù)據(jù)塊時(shí)比必須發(fā)送許多小的數(shù)據(jù)塊時(shí)的效率高得多。

有兩個(gè)方法啟用響應(yīng)緩沖。第一種,您可以使用 Internet Services Manager 為整個(gè)應(yīng)用程序啟用響應(yīng)緩沖。我們建議采用這種方法,在 IIS 4.0 和 IIS 5.0 中默認(rèn)為新的 ASP 應(yīng)用程序啟用響應(yīng)緩沖。第二種,可以在每個(gè) ASP 頁(yè)面的接近頂端的地方加入下面的代碼行,從而啟用響應(yīng)緩沖:

<% Response.Buffer = True %>

此代碼行必須在任何響應(yīng)數(shù)據(jù)被寫(xiě)到瀏覽器之前執(zhí)行(即,在任何 HTML 出現(xiàn)在 ASP 腳本之前以及在使用 Response.Cookies 集合設(shè)置任何 Cookies 之前)。一般來(lái)說(shuō),最好為整個(gè)應(yīng)用程序啟用響應(yīng)緩沖。這樣,您就不必在每個(gè)頁(yè)面最上面寫(xiě)入上述的代碼行。

Response.Flush

關(guān)于響應(yīng)緩沖有一個(gè)常見(jiàn)的抱怨,就是用戶(hù)感覺(jué)到 ASP 頁(yè)面的響應(yīng)速度很慢(即使整個(gè)響應(yīng)時(shí)間得到改進(jìn)),因?yàn)樗麄儽仨毜鹊秸麄€(gè)頁(yè)面生成,然后他們才能看到東西。對(duì)于運(yùn)行時(shí)間長(zhǎng)的頁(yè)面,您可以設(shè)置 Response.Buffer = False,禁用響應(yīng)緩沖。但是,一個(gè)更好的策略是利用 Response.Flush 方法。這種方法將 ASP 轉(zhuǎn)換的所有 HTML 送到瀏覽器。例如,在轉(zhuǎn)換 1,000 行的表的前 100 行之后,ASP 可以調(diào)用 Response.Flush,強(qiáng)制將轉(zhuǎn)換的結(jié)果送到瀏覽器,這樣可使用戶(hù)在其余的行準(zhǔn)備好之前看到頭 100 行。這種技術(shù)可以將響應(yīng)緩沖與瀏覽器逐漸顯示數(shù)據(jù)完美地結(jié)合在一起。

(注意在上面的 1,000 行表的舉例中,許多瀏覽器在它們看到關(guān)閉 標(biāo)記之前不會(huì)開(kāi)始顯示表。檢查您的目標(biāo)瀏覽器是否支持。為避免這種情況,將表分成多個(gè)具有較少行的表,并在每個(gè)表之后調(diào)用 Response.Flush。較新版本的 Internet Explorer 在表完全下載之前就開(kāi)始顯示表,如果您指定表列寬,顯示速度就會(huì)特別快,這樣做可避免強(qiáng)制 Internet Explorer 通過(guò)測(cè)量每個(gè)單元格的內(nèi)容寬度來(lái)計(jì)算列寬。)

另一個(gè)關(guān)于響應(yīng)緩沖的常見(jiàn)的抱怨是,當(dāng)產(chǎn)生非常大的頁(yè)面時(shí),將占用許多服務(wù)器內(nèi)存。撇開(kāi)產(chǎn)生大頁(yè)面的方法不談,這種問(wèn)題也可通過(guò)巧妙使用 Response.Flush 來(lái)加以解決。

技巧 15:批處理內(nèi)嵌腳本和 Response.Write 語(yǔ)句

VBScript 語(yǔ)法 <% = expression %> 將“expression”的值寫(xiě)到 ASP 輸出流中。如果響應(yīng)緩沖未啟用,那么執(zhí)行其中的每一條語(yǔ)句,都會(huì)以許多小的數(shù)據(jù)包通過(guò)網(wǎng)絡(luò)將數(shù)據(jù)寫(xiě)到瀏覽器中。這樣速度很慢。而且穿插執(zhí)行少量的腳本和 HTML,將引起腳本引擎和 HTML 之間的切換,從而降低性能。因此,使用下面的技巧:使用 Response.Write 調(diào)用代替捆綁緊密的內(nèi)嵌表達(dá)式。例如,在下面的示例中,在每一行的每一字段對(duì)響應(yīng)流有一次寫(xiě)操作,每一行在 VBScript 和 HTML 之間有許多切換:


<% For Each fld in rs.Fields %>

<%
Next
While Not rs.EOF
%>

<% For Each fld in rs.Fields %>

<% Next

<% rs.MoveNext
Wend %>
<% = fld.Name %>
<% = fld.Value %>

下面的代碼更有效,每一行對(duì)響應(yīng)流有一次寫(xiě)操作。所有的代碼都包含在一個(gè) VBScript 塊內(nèi):


<%
For each fld in rs.Fields
Response.Write (?
? & vbCrLf)
Next
While Not rs.EOF
Response.Write (?
?)
For Each fld in rs.Fields %>
Response.Write(?
? & vbCrLf)
Next
Response.Write ?
?
Wend
%>
? & fld.Name & ?
? & fld.Value & ?

當(dāng)禁用響應(yīng)緩沖時(shí),這一技巧的效果特別大。最好啟用響應(yīng)緩沖,然后看批處理 Response.Write 是否有助于提高性能。

(在這一特定舉例中,建立表主體的嵌套循環(huán) (While Not rs.EOF...) 可以用仔細(xì)構(gòu)建的 GetString 調(diào)用來(lái)替代。)

技巧 16:如果頁(yè)面需要很長(zhǎng)時(shí)間才能完成,那么執(zhí)行前使用 Response.IsClientConnected

如果用戶(hù)性急,他們可能會(huì)在您開(kāi)始執(zhí)行他們的請(qǐng)求之前,就會(huì)放棄 ASP 頁(yè)面。如果他們單擊刷新或移到服務(wù)器上的另一個(gè)頁(yè)面,在 ASP 請(qǐng)求隊(duì)列的末尾就有一個(gè)新的請(qǐng)求等候,在隊(duì)列的中間有一個(gè)斷開(kāi)連接的請(qǐng)求。當(dāng)服務(wù)器的負(fù)載很高時(shí)(因此請(qǐng)求隊(duì)列就會(huì)很長(zhǎng),響應(yīng)時(shí)間也會(huì)相應(yīng)地變長(zhǎng)),就會(huì)經(jīng)常發(fā)生這種情況,這樣只能使情況變得更糟。如果用戶(hù)不再連接,執(zhí)行 ASP 頁(yè)面(特別是慢的、大的 ASP 頁(yè)面)已沒(méi)有任何意義。您可以使用 Response.IsClientConnected 屬性檢查這一情況。如果它返回 False,則應(yīng)調(diào)用 Response.End 并放棄頁(yè)的其余部分。事實(shí)上,IIS 5.0 已將這一做法編為程序 - 每當(dāng) ASP 即將執(zhí)行新請(qǐng)求時(shí),它就會(huì)檢查請(qǐng)求在隊(duì)列中已等候了多長(zhǎng)時(shí)間。如果已經(jīng)在那里等候了多于 3 秒鐘,ASP 將檢查客戶(hù)機(jī)是否仍處于連接狀態(tài),如果沒(méi)有連接,就立即終止請(qǐng)求。您可以在配置數(shù)據(jù)庫(kù)中使用 AspQueueConnectionTestTime 設(shè)置將超時(shí)時(shí)間由 3 秒調(diào)整為其它值。

如果頁(yè)面要花很長(zhǎng)時(shí)間才能執(zhí)行完,也可以不時(shí)地檢查 Response.IsClientConnected。當(dāng)啟用了響應(yīng)緩沖時(shí),最好不時(shí)地執(zhí)行 Response.Flush,以用戶(hù)知道,正在發(fā)生什么事。

注意 在 IIS 4.0 上,除非先執(zhí)行了 Response.Write,否則 Response.IsClientConnected 就不能正常工作。如果啟用了緩沖,您也必須執(zhí)行 Response.Flush。在 IIS 5.0 上,卻沒(méi)有必要這樣做,- Response.IsClientConnected 工作正常。在任何情況下,Response.IsClientConnected 都會(huì)有一些開(kāi)銷(xiāo),因此只有在一個(gè)操作至少要花(比方說(shuō)) 500 毫秒(如果您想維持每秒鐘數(shù)十頁(yè)的吞吐量,這是一個(gè)很長(zhǎng)的時(shí)間)才使用它。經(jīng)驗(yàn)表明,不要每次重復(fù)執(zhí)行緊密循環(huán)時(shí)都調(diào)用它,如顯示表的許多行時(shí) - 每隔二十或五十行調(diào)用一次可能比較合適。

技巧 17:使用 標(biāo)記例示對(duì)象

如果要引用不在所有代碼路徑(特別是服務(wù)器或應(yīng)用程序作用域的對(duì)象)中使用的對(duì)象,使用 Global.asa 中 標(biāo)記聲明它們,而不使用 Server.CreateObject 方法。Server.CreateObject 能立即創(chuàng)建對(duì)象。如果以后不再使用該對(duì)象,您就浪費(fèi)了資源。 標(biāo)記聲明 objname,但在其方法或?qū)傩缘谝淮问褂靡郧?,不?huì)創(chuàng)建 objname。

這又是一個(gè)惰性計(jì)算的例子。

技巧 18:對(duì)于 ADO 和其它組件使用 TypeLib 聲明

當(dāng)使用 ADO 時(shí),開(kāi)發(fā)人員經(jīng)常加入 adovbs.txt,以訪問(wèn) ADO 的各種常量。在要使用常量的每個(gè)頁(yè)面中必須包含此文件。此常量文件相當(dāng)大,給每個(gè) ASP 頁(yè)面的編譯時(shí)間和腳本大小增加了許多系統(tǒng)開(kāi)銷(xiāo)。

IIS 5.0 引入了綁定到組件類(lèi)型庫(kù)的功能。這可使您引用類(lèi)型庫(kù)一次,并將其用在每個(gè) ASP 頁(yè)面上。每個(gè)頁(yè)面不會(huì)產(chǎn)生編譯常量文件的開(kāi)銷(xiāo),且組件開(kāi)發(fā)人員不必建立 VBScript#_include 文件以在 ASP 上使用。

要訪問(wèn) ADO TypeLib,將下面一條語(yǔ)句放在 Global.asa 中。



技巧 19: 利用瀏覽器的驗(yàn)證功能

現(xiàn)今的瀏覽器對(duì)一些高級(jí)功能如 XML、DHTML、Java 小程序和遠(yuǎn)程數(shù)據(jù)服務(wù)提供支持。盡可能使用這些功能。所有這些技術(shù)都可以執(zhí)行客戶(hù)機(jī)端驗(yàn)證和數(shù)據(jù)緩存,免去了到 Web 服務(wù)器的往返。如果您在運(yùn)行一個(gè)智能瀏覽器,那么瀏覽器就能為您進(jìn)行一些驗(yàn)證(例如,在執(zhí)行 POST 之前,檢查信用卡校驗(yàn)和是否有效)。盡可能使用這一功能。通過(guò)減少客戶(hù)-服務(wù)器之間的往返,可降低 Web 服務(wù)器上的負(fù)載,并能減少網(wǎng)絡(luò)通信量(雖然發(fā)送到瀏覽器的第一個(gè)頁(yè)面可能比較大)以及服務(wù)器訪問(wèn)的任何后端資源。此外,用戶(hù)不必像住常一樣讀取新頁(yè),從而用戶(hù)的感覺(jué)會(huì)好一些。這樣做并不意味著您可以不進(jìn)行服務(wù)器端驗(yàn)證 - 您還應(yīng)始終進(jìn)行服務(wù)器端驗(yàn)證。這可以防止由于某種原因(如黑客,或?yàn)g覽器不運(yùn)行客戶(hù)機(jī)端驗(yàn)證例程)客戶(hù)機(jī)產(chǎn)生錯(cuò)誤的數(shù)據(jù)。

人們已經(jīng)進(jìn)行了大量的工作,開(kāi)發(fā)“獨(dú)立于瀏覽器”的 HTML。正是由于這種憂(yōu)慮,開(kāi)發(fā)人員不愿再使用流行的瀏覽器功能,但這些功能本可以改善性能。對(duì)于一些真正的高性能站點(diǎn),必須關(guān)心瀏覽器“訪問(wèn)”問(wèn)題,一個(gè)好的策略是優(yōu)化頁(yè)面,使其適應(yīng)流行的瀏覽器。使用瀏覽器功能組件,可以在 ASP 中方便地檢測(cè)到瀏覽器功能。Microsoft FrontPage 等工具有助于設(shè)計(jì)適合于瀏覽器和指定 HTML 版本的代碼。參見(jiàn) When is Better Worse?Weighing the Technology Trade-Offs,以了解更進(jìn)一步的討論。

技巧 20:避免在循環(huán)語(yǔ)句中使用字符串串聯(lián)

許多人在循環(huán)語(yǔ)句中建立一個(gè)字符串,如下所示:

s = ?

? & vbCrLf
For Each fld in rs.Fields
s = s & ?
?
Next

While Not rs.EOF
s = s & vbCrLf & ?
?
For Each fld in rs.Fields
s = s & ?
?
Next
s = s & ?
?
rs.MoveNext
Wend

s = s & vbCrLf & ?
? & fld.Name & ?
? & fld.Value & ?
? & vbCrLf
Response.Write s

采用這種方法會(huì)出現(xiàn)一些問(wèn)題。第一個(gè)問(wèn)題是反復(fù)串聯(lián)字符串需要花兩次方的時(shí)間,更通俗地說(shuō),運(yùn)行這種循環(huán)語(yǔ)句所花的時(shí)間與記錄數(shù)乘以字段數(shù)所得值的平方成正比。舉一個(gè)更簡(jiǎn)單的例子,就可以更清楚地說(shuō)明這一問(wèn)題。

s = ??
For i = Asc(?A?) to Asc(?Z?)
s = s & Chr(i)
Next

在第一次迭代中,您獲得了一個(gè)字符的字符串 ?A?。在第二次迭代中,VBScript 必須重新分配字符串并將兩個(gè)字符 (?AB?) 復(fù)制到 s 中。在第三次迭代中,它還必須再次重新分配 s 并將三個(gè)字符復(fù)制到 s 中。在 N 次(第 26 次)迭代中,它必須重新分配并將 N 個(gè)字符復(fù)制到 s 中??偣簿褪?1+2+3+...+N,即 N*(N+1)/2 次復(fù)制。

在上面的記錄集舉例中,如果有 100 個(gè)記錄和 5 個(gè)字段,內(nèi)循環(huán)將執(zhí)行 100*5 = 500 次,所有的復(fù)制和重新分配所花的時(shí)間與 500*500 = 250,000 成正比。這對(duì)于中等大小的記錄集來(lái)說(shuō)復(fù)制操作太多了。

在本例中,代碼可以用 Response.Write() 或內(nèi)嵌腳本 (<% = fld.Value %>) 替代字符串串聯(lián)來(lái)改進(jìn)。如果啟用了響應(yīng)緩沖的話(應(yīng)該的),這樣做就會(huì)更快,因?yàn)?Response.Write 只將數(shù)據(jù)附加到響應(yīng)緩沖的末尾。并不涉及重新分配,因此效率很高。

在將 ADO 記錄集轉(zhuǎn)換為 HTML 表的特定情況下,應(yīng)考慮使用 GetRows 或 GetString。

如果在 JScript 中串聯(lián)字符串,特別建議使用 += 運(yùn)算符,即,使用 s += ?某字符串?,而不使用 s = s + ?某字符串?。

技巧 21:?jiǎn)⒂脼g覽器和代理緩存

在默認(rèn)情況下,ASP 禁止在瀏覽器和代理中進(jìn)行緩存。這是有意義的,因?yàn)榫蛯?shí)質(zhì)而言 ASP 頁(yè)面是動(dòng)態(tài)的,上面有隨時(shí)間不斷變化的潛在信息。如果頁(yè)面不要求在每個(gè)視圖上進(jìn)行刷新,您應(yīng)啟用瀏覽器和代理緩存。這可使瀏覽器和代理在一定的時(shí)間內(nèi)使用頁(yè)面的“緩存”副本,您可以控制時(shí)間的長(zhǎng)短。緩存可以大大減輕服務(wù)器上的負(fù)載,縮短用戶(hù)的等待時(shí)間。

哪一種動(dòng)態(tài)頁(yè)面可作為要緩存的頁(yè)面呢?下面舉一些例子:

天氣預(yù)報(bào)頁(yè)面,在此頁(yè)面上,每隔 5 分鐘更新一次天氣預(yù)報(bào)。 列出新聞條目或新聞稿的主頁(yè),它一天更新兩次。 共同基金業(yè)績(jī)列表,在此列表中,基本統(tǒng)計(jì)信息每隔幾小時(shí)更新一次。

注意,在使用瀏覽器或代理緩存的情況下,Web 服務(wù)器上記錄的訪問(wèn)次數(shù)減少了。如果您想準(zhǔn)確地測(cè)量所有頁(yè)面視圖或張?zhí)?,您就不希望使用瀏覽器和代理緩存。

瀏覽器緩存由 HTTP“過(guò)期”報(bào)頭控制,該報(bào)頭由 Web 服務(wù)器發(fā)送給瀏覽器。ASP 提供兩個(gè)簡(jiǎn)單的機(jī)制發(fā)送此報(bào)頭。要設(shè)置頁(yè)面使其過(guò)多少分鐘后到期,則應(yīng)設(shè)置 Response.Expires 屬性。下面的例子告訴瀏覽器內(nèi)容在 10 分鐘內(nèi)過(guò)期:

<% Response.Expires = 10 %>

若將 Response.Expires 設(shè)置為負(fù)數(shù)或 0,則禁用緩存。一定要使用大的負(fù)數(shù),如 -1000(略多于一天),以避免服務(wù)器和瀏覽器時(shí)鐘之間的不匹配。第二個(gè)屬性 Response.ExpiresAbsolute 將使您設(shè)置內(nèi)容過(guò)期的具體時(shí)間:

<% Response.ExpiresAbsolute = #May 31,2001 13:30:15# %>

您可以不使用 Response 對(duì)象設(shè)置過(guò)期時(shí)間,而將 標(biāo)記寫(xiě)進(jìn) HTML,通常寫(xiě)在 HTML 文件的 部分。一些瀏覽器將遵照此指令,而代理則不然。


最后,您可以使用 Response.CacheControl 屬性,指示其內(nèi)容是否可以讓 HTTP 代理緩存。若將此屬性設(shè)置為“Public”,代理就可以緩存此內(nèi)容。

<% Response.CacheControl = ?Public? %>

在默認(rèn)情況下,此屬性被設(shè)置為“Private”。注意,對(duì)于顯示某用戶(hù)特定數(shù)據(jù)的頁(yè)面,不應(yīng)啟用代理緩存,因?yàn)榇砜赡芙o用戶(hù)提供屬于其他用戶(hù)的頁(yè)面。

技巧 22:盡可能使用 Server.Transfer 代替 Response.Redirect

Response.Redirect 讓瀏覽器請(qǐng)求另一個(gè)頁(yè)面。此函數(shù)常用來(lái)將用戶(hù)重定向到一個(gè)登錄或錯(cuò)誤頁(yè)面。因?yàn)橹囟ㄏ驈?qiáng)制請(qǐng)求新頁(yè)面,結(jié)果是瀏覽器必須到 Web 服務(wù)器往返兩次,且 Web 服務(wù)器必須多處理一個(gè)請(qǐng)求。IIS 5.0 引入了一個(gè)新的函數(shù) Server.Transfer,它將執(zhí)行轉(zhuǎn)移到同一臺(tái)服務(wù)器上的另一個(gè) ASP 頁(yè)。這樣就避免多余的瀏覽器-Web-服務(wù)器的往返,從而改善了總體系統(tǒng)性能以及縮短了用戶(hù)的響應(yīng)時(shí)間。檢查“重定向”中的“新的方向”,上面應(yīng)該是 Server.Transfer 和 Server.Execute。

另請(qǐng)參見(jiàn) Leveraging ASP in IIS 5.0,了解 IIS 5.0 和 ASP 3.0 新功能的完整列表。

技巧 23:在目錄 URL 中使用后斜杠

一個(gè)相關(guān)的技巧是確保在指向目錄的 URL 中使用后斜杠 (/)。如果您省略了后斜杠,瀏覽器就會(huì)向服務(wù)器發(fā)出請(qǐng)求,只是為了告訴服務(wù)器,它在請(qǐng)求目錄。瀏覽器就會(huì)發(fā)出第二個(gè)請(qǐng)求,將斜杠附加到 URL 后面,只有此后,服務(wù)器才能以該目錄的默認(rèn)文檔或目錄列表(如果沒(méi)有默認(rèn)文檔且啟用了目錄瀏覽的話)響應(yīng)。附加斜杠可省去第一個(gè)、無(wú)用的住返。為便于用戶(hù)閱讀,可以省略顯示名稱(chēng)中的后斜杠。

例如,寫(xiě):

Workshop?>http://msdn.microsoft.com/workshop

這也適用于指向 Web 站點(diǎn)上主頁(yè)的 URL:使用下面的:,而不使用 。

技巧 24:避免使用服務(wù)器變量

訪問(wèn)服務(wù)器變量會(huì)使 Web 站點(diǎn)向服務(wù)器發(fā)出一個(gè)特殊請(qǐng)求,并收集所有服務(wù)器變量,而不只是您請(qǐng)求的那個(gè)變量。這種情況類(lèi)似于,在發(fā)霉的閣樓上,在一個(gè)文件夾中查找某個(gè)文件。當(dāng)您想要找那個(gè)文件時(shí),您必須去閣樓上,先找到文件夾,然后才能找到這份文件。當(dāng)您請(qǐng)求服務(wù)器變量時(shí),發(fā)生的情況是一樣的 - 您第一次請(qǐng)求服務(wù)器變量時(shí),就會(huì)使性能受到影響。后面的對(duì)其它服務(wù)器變量的請(qǐng)求,則不會(huì)對(duì)性能產(chǎn)生影響。

決不要訪問(wèn)非限定的 Request 對(duì)象(例如,Request("Data"))。對(duì)于不在 Request.Cookies、Request.Form、Request.QueryString 或 Request.ClientCertificate 中的項(xiàng)目,則隱式調(diào)用 Request.ServerVariables。Request.ServerVariables 集合比其它集合慢得多。

技巧 25:升級(jí)到最新和最出色的

系統(tǒng)組件是恒定的,我們建議您將它們升級(jí)到最新和最好的配置。最好升級(jí)到 Windows 2000(因此,也應(yīng)升級(jí)到 IIS 5.0、ADO 2.5、MSXML 2.5、Internet Explorer 5.0、VBScript 5.1 和 JScript 5.1)。在多處理器計(jì)算機(jī)上,實(shí)施 IIS 5.0 和 ADO 2.5 可顯著改善性能。在 Windows 2000 下,ASP 可以很好地?cái)U(kuò)展到四個(gè)處理器或更多,而在 IIS 4.0 下,ASP 的擴(kuò)展性不能超出兩個(gè)處理器。在應(yīng)用程序中使用的腳本代碼和 ADO 越多,升級(jí)到 Windows 2000 之后,性能的改善就會(huì)越多。

如果目前還不能升級(jí)到 Windows 2000,您可以升級(jí)到 SQL Server、ADO、VBScript 和 JScript、MSXML、Internet Explorer 和 NT 4 Service Packs 的最新版本。它們均可提高性能和可靠性。

技巧 26:優(yōu)化 Web 服務(wù)器

有多種 IIS 優(yōu)化參數(shù)可以改善站點(diǎn)性能。例如,對(duì)于 IIS 4.0,我們常常發(fā)現(xiàn),增加 ASP ProcessorThreadMax 參數(shù)(參見(jiàn) IIS 文檔)可以顯著改善性能,特別是在傾向于等待后端資源(如數(shù)據(jù)庫(kù))或其它中間產(chǎn)品(如屏幕刷)的站點(diǎn)上。在 IIS 5.0 中,您可能發(fā)現(xiàn)啟用 ASP Thread Gating 比查找一個(gè) AspProcessorThreadMax 最佳設(shè)置效率更高,這一點(diǎn)現(xiàn)在已為大家所熟知。

有關(guān)較好的參考資料,參見(jiàn)下面的優(yōu)化 IIS。

最佳的配置設(shè)置取決于(其中一些因素)應(yīng)用程序代碼、運(yùn)行所在的系統(tǒng)硬件和客戶(hù)機(jī)工作負(fù)荷。找到最佳設(shè)置的唯一方法是進(jìn)行性能測(cè)試,這是我們?cè)谙乱粋€(gè)技巧中所要討論的。

技巧 27:進(jìn)行性能測(cè)試

正如我們?cè)谇懊嬉呀?jīng)講過(guò),性能是一個(gè)特征。如果您想要改善站點(diǎn)的性能,那么就制定一個(gè)性能目標(biāo),然后逐步改進(jìn),直到達(dá)到目標(biāo)為止。不要,就不進(jìn)行任何性能測(cè)試。通常,在項(xiàng)目結(jié)束時(shí),再作必需的結(jié)構(gòu)調(diào)整已經(jīng)為時(shí)太晚,您的客戶(hù)將為此感到失望。將性能測(cè)試作為您日常測(cè)試的一部分來(lái)進(jìn)行??梢詫?duì)單個(gè)組件分別進(jìn)行性能測(cè)試,如針對(duì) ASP 頁(yè)或 COM 對(duì)象,或?qū)⒄军c(diǎn)作為一個(gè)整體來(lái)測(cè)試。

許多人使用單個(gè)瀏覽器請(qǐng)求頁(yè)面,來(lái)測(cè)試 Web 站點(diǎn)的性能。這樣做就會(huì)給您一個(gè)感覺(jué),即站點(diǎn)的響應(yīng)能力很好,但這樣做實(shí)際上并不能告訴您在負(fù)載條件下站點(diǎn)的性能如何。

一般情況下,要想準(zhǔn)確地測(cè)試性能,您需要一個(gè)專(zhuān)門(mén)的測(cè)試環(huán)境。此環(huán)境應(yīng)包括硬件,其處理器速度、處理器數(shù)量、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)配置等方面與生產(chǎn)環(huán)境的硬件相似。其次,您必須指定客戶(hù)機(jī)的工作負(fù)荷:有多少同時(shí)的用戶(hù),他們發(fā)出請(qǐng)求的頻率,他們點(diǎn)擊頁(yè)面的類(lèi)型等等。如果您沒(méi)有站點(diǎn)實(shí)際使用情況的數(shù)據(jù),您必須估計(jì)一下使用的情況。最后,您需要一個(gè)可以模擬預(yù)期客戶(hù)機(jī)工作負(fù)荷的工具。有了這些工具,您就可以開(kāi)始回答諸如“如果我有 N 個(gè)同時(shí)的用戶(hù),那么需要多少服務(wù)器?”之類(lèi)的問(wèn)題。您還可以找出出現(xiàn)瓶頸的原因,并以此為目標(biāo)進(jìn)行優(yōu)化。

下面列出了一些好的 Web 負(fù)載測(cè)試工具。我們特別推薦 Microsoft Web Application Stress (WAS) 工具包。WAS 可使您記錄測(cè)試腳本,然后模擬數(shù)百或成千上萬(wàn)個(gè)用戶(hù)訪問(wèn) Web 服務(wù)器。WAS 報(bào)告很多統(tǒng)計(jì)信息,包括每秒鐘的請(qǐng)求數(shù),響應(yīng)時(shí)間分布情況和錯(cuò)誤計(jì)數(shù)。WAS 有豐富的客戶(hù)機(jī)界面和基于 Web 的界面兩種,Web 界面可使您進(jìn)行遠(yuǎn)程測(cè)試。

一定要閱讀 IIS 5.0 Tuning Guide。

技巧 28:閱讀資源鏈接

下面是一些與性能有關(guān)的出色的資源鏈接。如果您想了解有關(guān)信息,請(qǐng)閱讀 Developing Scalable Web Applications。

資源 優(yōu)化 ASP 腳本

優(yōu)化 IIS

ADO 和 SQL Server

ASP 組件和線程模型

詞典組件

會(huì)話狀態(tài)

性能和可擴(kuò)展性

工具

書(shū)目

ASP Web 站點(diǎn)

ASP 樣式

XML

優(yōu)化 ASP 腳本

Developing Scalable Web Applications

Got Any Cache? Nancy Winnick Cluts 著

Maximizing the Performance of Your Active Server Pages,Nancy Winnick Cluts 著

15 Seconds: Performance Section

Enhancing Performance in ASP - Part I,Wayne Plourde 著

When is Better Worse? Weighing the Technology Trade-Offs,Nancy Winnick Cluts 著

Speed and Optimization Resources,Charles Carroll 著

優(yōu)化 IIS

The Art and Science of Web Server Tuning with Internet Information Services 5.0

Leveraging ASP in IIS 5.0,J.D. Meier 著

Tuning IIS 4.0 for High Volume Sites,Michael Stephenson 著

Tuning Internet Information Server Performance,Mike Moore 著

Navigating the Maze of Settings for Web Server Performance Optimization,Todd Wanke 著

Managing Internet Information Server 4.0 for Performance,Hans Hugli 著

ADO 和 SQL Server

Top Ten Tips: Accessing SQL Through ADO and ASP,J.D. Meier 著

Improve the Performance of your MDAC Application,Suresh Kannan 著

Pooling in the Microsoft Data Access Components,Leland Ahlbeck 和 Don Willits 合著

SQL Server: Performance Benchmarks and Guides

Improving the Performance of Data Access Components with IIS 4.0,Leland Ahlbeck 著

Microsoft Data Access Components (MDAC) and ActiveX Data Objects (ADO) Performance Tips,Leland Ahlbeck 著

Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - The Server Perspective,Damien Lindauer 著

Microsoft SQL Server 7.0 Practical Performance Tuning and Optimization - The Application Perspective,Damien Lindauer 著

Accessing Recordsets over the Internet,Dino Esposito 著

ASP 組件和線程模型

ASP Component Guidelines,J.D. Meier 著

Q243548: INFO: Design Guidelines for VB Components under ASP

Threading Models Explained,Nancy Winnick Cluts 著

So Happy Together? Using ActiveX components with Active Server Pages,Nancy Winnick Cluts 著

Developing Active Server Components with ATL,George Reilly 著

Agility in Server Components,Neil Allain 著

Building High-Performance Middle-Tier Components with C++,Jon Flanders 著

Active Server Pages and COM Apartments,Don Box 著

House of COM: Active Server Pages,Don Box 著

House of COM: Contexts,Don Box 著

House of COM: Performance Trade-offs of the Windows 2000 Component Execution Environment,Don Box 著

Building COM Components That Take Full Advantage of Visual Basic and Scripting,Ivo Salmre 著

Component Design Principles for MTS

詞典組件

Creating a Page Cache Object,Robert Coleridge 著

Abridging the Dictionary Object: The ASP Team Creates a Lookup-Table Object,Robert Carter 著

Caprock Dictionary

Site Server Commerce Edition includes a dictionary component

會(huì)話狀態(tài)

Q175167: HOWTO: Persisting Values Without Sessions

Q157906: HOWTO: How To Maintain State Across Pages with VBScript

XML-based Persistence Behaviors Fix Web Farm Headaches,Aaron Skonnard 著

House of COM: Stateless Programming,Don Box 著

性能和擴(kuò)展性

Blueprint for Building Web Sites Using the Microsoft Windows DNA Platform

Server Performance and Scalability Killers,George Reilly 著

Microsoft Visual Studio Scalability Center

Fitch & Mather Stocks 2000

Tuning the FMStocks Application

High-Performance Visual Basic Apps,Ken Spencer 著

Duwamish Books,Phase 4

Top Windows DNA Performance Mistakes and How to Prevent Them,Gary Geiger 和 Jon Pulsipher 合著

Building from Static HTML to High-Performance Web-Farms,Shawn Bice 著

工具

Microsoft Web Application Stress Tool

I Can't Stress It Enough -- Load Test Your ASP Application,J.D. Meier 著

Windows DNA Performance Kit

Monitoring Events in Distributed Applications Using Visual Studio Analyzer,Mai-lan Tomsen 著

書(shū)目

Professional Active Server Pag

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

納祥科技推出太陽(yáng)能+Type-C雙充電自行車(chē)前燈方案,方案核心模塊包含太陽(yáng)能板、單片機(jī)、三極管、3顆LED燈珠與1200mAh電池,通過(guò)低功耗單片機(jī)與三極管驅(qū)動(dòng),支持強(qiáng)光/弱光/爆閃3種模式,高流明遠(yuǎn)射程,適配多種車(chē)型

關(guān)鍵字: 方案開(kāi)發(fā) 電子方案 自行車(chē)前燈方案 納祥科技

慕尼黑2025年9月11日 /美通社/ -- 當(dāng)?shù)貢r(shí)間9月9日,賽力斯動(dòng)力在德國(guó)慕尼黑國(guó)際車(chē)展期間舉辦技術(shù)發(fā)布與交流會(huì),正式在海外市場(chǎng)推出全新一代賽力斯超級(jí)增程、高效發(fā)動(dòng)機(jī)和新一代分布式電驅(qū)動(dòng)系統(tǒng),同時(shí)與來(lái)自全球的汽車(chē)產(chǎn)...

關(guān)鍵字: 慕尼黑 分布式 發(fā)動(dòng)機(jī) 新能源汽車(chē)

慕尼黑2025年9月11日 /美通社/ -- 高端智能電動(dòng)汽車(chē)品牌問(wèn)界(AITO)在2025年德國(guó)國(guó)際汽車(chē)及智慧出行博覽會(huì)(IAA MOBILITY)上,正式發(fā)布了其最新全球產(chǎn)品陣容——專(zhuān)為中東市場(chǎng)深度本地化打造的AIT...

關(guān)鍵字: AI 智能駕駛 測(cè)試 生態(tài)系統(tǒng)

舍弗勒首次為中國(guó)頭部車(chē)企大規(guī)模生產(chǎn)高壓逆變磚 天津工廠一年內(nèi)完成量產(chǎn)準(zhǔn)備,逆變器模塊性能參數(shù)顯著提升 與合作伙伴羅姆半導(dǎo)體共研尖端碳化硅技術(shù),效率更高、性能更優(yōu) 模塊化可擴(kuò)展設(shè)計(jì)使逆變磚易于集成,可廣泛...

關(guān)鍵字: 逆變 高壓 逆變器 集成

舍弗勒以"專(zhuān)注驅(qū)動(dòng)技術(shù)的科技公司"為主題亮相IAA MOBILITY 2025(B3館B40展臺(tái)) 合并緯湃科技后首次亮相IAA MOBILITY,展示拓展后的汽車(chē)產(chǎn)品組合 憑借在軟件、...

關(guān)鍵字: 電氣 軟件 驅(qū)動(dòng)技術(shù) BSP

拉斯維加斯2025年9月11日 /美通社/ -- 在9月8日至11日舉辦的RE+ 2025展會(huì)上,全球綜合儲(chǔ)能解決方案供應(yīng)商德賽電池(Desay Battery)全面展示了其創(chuàng)新成果,并宣布與深圳市華寶新能源股份有限公司...

關(guān)鍵字: 電池 電芯 人工智能 鋰電

香港2025年 9月12日 /美通社/ -- 全球領(lǐng)先的互聯(lián)網(wǎng)社區(qū)創(chuàng)建者 - 網(wǎng)龍網(wǎng)絡(luò)控股有限公司 ("網(wǎng)龍"或"本公司",香港交易所股票代碼:777)欣然宣布,其子公司My...

關(guān)鍵字: AI 遠(yuǎn)程控制 控制技術(shù) BSP

慕尼黑2025年9月12日 /美通社/ -- 慕尼黑當(dāng)?shù)貢r(shí)間9月10日,在2025德國(guó)國(guó)際汽車(chē)及智慧出行博覽會(huì)(IAA MOBILITY)上,國(guó)際獨(dú)立第三方檢測(cè)、檢驗(yàn)和認(rèn)證機(jī)...

關(guān)鍵字: 測(cè)試 慕尼黑 模型 HUBER

上海2025年9月12日 /美通社/ -- 近日,國(guó)際獨(dú)立第三方檢測(cè)、檢驗(yàn)和認(rèn)證機(jī)構(gòu)德國(guó)萊茵TÜV大中華區(qū)(簡(jiǎn)稱(chēng)"TÜV萊茵")為上海...

關(guān)鍵字: 測(cè)試 信息安全 安全管理 開(kāi)關(guān)

廣州2025年9月12日 /美通社/ -- 9月11日,由國(guó)際獨(dú)立第三方檢測(cè)、檢驗(yàn)和認(rèn)證機(jī)構(gòu)德國(guó)萊茵TÜV大中華區(qū)(簡(jiǎn)稱(chēng)"TÜV萊茵"...

關(guān)鍵字: 數(shù)字化 供應(yīng)鏈 控制 電子
關(guān)閉