明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

微軟建議的ASP優(yōu)化性能28條守則(2)

[摘要]技巧 3:將數(shù)據(jù)和 HTML 緩存在 Web 服務(wù)器的磁盤上 有時(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ù)器的硬盤...
技巧 3:將數(shù)據(jù)和 HTML 緩存在 Web 服務(wù)器的磁盤上
有時(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ù)器的硬盤上?梢酝瑫r(shí)將數(shù)據(jù)緩存在磁盤和內(nèi)存中,為您的站點(diǎn)建立最適宜的緩存策略。

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

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

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

Scripting.FileSystemObject 可使您創(chuàng)建、讀和寫文件。
與 Internet Explorer 一起提供的 Microsoft® XML 解析器 (MSXML) 支持保存和裝載 XML 文檔。
LookupTable 對(duì)象(例如,用在 MSN 上)是從磁盤裝載簡(jiǎn)單列表的最好選擇。
最后,應(yīng)考慮將數(shù)據(jù)的表示緩存在磁盤上,而不是數(shù)據(jù)本身。預(yù)先轉(zhuǎn)換的 HTML 可以用 .htm 或 .asp 文件存儲(chǔ)在磁盤上,超級(jí)鏈接可以直接指向這些文件?梢允褂蒙逃霉ぞ撸 XBuilder,或 Microsoft® SQL Server™ Internet 發(fā)布功能將產(chǎn)生 HTML 的過(guò)程自動(dòng)化;蛘,您可以將 HTML 代碼片斷放在 .asp 文件中。還可以使用 FileSystemObject 從磁盤讀取 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 或更低版本編寫的對(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)建和銷毀)。

在 IIS 4.0 中,被標(biāo)記為 ThreadingModel=Both 的組件被認(rèn)為是敏捷的。在 IIS 5.0 中,只有這一點(diǎn)還不夠。組件必須不僅被標(biāo)記 Both,還必須聚集 FTM。有關(guān)敏捷性的文章講述了如何使以 Active Template Library 編寫的 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 中使用 <object runat=server scope=application ...> 避免這一錯(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è)類比,也許會(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ū)π阅艿挠绊懮踔粮鼔摹SP 必須創(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è)開銷很大的到特殊線程的上下文切換;執(zhí)行組件的方法;將結(jié)果匯集到共享區(qū)域;執(zhí)行另一個(gè)開銷很大的上下文切換,將控制返回到原始的線程!按谢币馑际侵该看沃贿\(yùn)行一個(gè)方法。兩個(gè)不同的 ASP 工作者線程不能同時(shí)在共享組件上執(zhí)行多個(gè)方法。這樣就杜絕了并發(fā)性,特別是在多處理器計(jì)算機(jī)上。更糟的是,所有非敏捷的 Application 作用域的組件共享一個(gè)線程(主機(jī) STA),因此串行化的影響甚至更顯著。

如之奈何?下面是一些一般的規(guī)則。如果您使用 Visual Basic (6.0) 或更早版本編寫對(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],向管理他們自己的配置客戶銷售 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 作用域中。