微軟建議的ASP優(yōu)化性能28條守則(6)
發(fā)表時(shí)間:2024-06-08 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]技巧 16:如果頁面需要很長時(shí)間才能完成,那么執(zhí)行前使用 Response.IsClientConnected 如果用戶性急,他們可能會(huì)在您開始執(zhí)行他們的請(qǐng)求之前,就會(huì)放棄 ASP 頁面。如果他們單擊刷新或移到服務(wù)器上的另一個(gè)頁面,在 ASP 請(qǐng)求隊(duì)列的末尾就有一個(gè)新的請(qǐng)求等候,在隊(duì)列的中間有一個(gè)...
技巧 16:如果頁面需要很長時(shí)間才能完成,那么執(zhí)行前使用 Response.IsClientConnected
如果用戶性急,他們可能會(huì)在您開始執(zhí)行他們的請(qǐng)求之前,就會(huì)放棄 ASP 頁面。如果他們單擊刷新或移到服務(wù)器上的另一個(gè)頁面,在 ASP 請(qǐng)求隊(duì)列的末尾就有一個(gè)新的請(qǐng)求等候,在隊(duì)列的中間有一個(gè)斷開連接的請(qǐng)求。當(dāng)服務(wù)器的負(fù)載很高時(shí)(因此請(qǐng)求隊(duì)列就會(huì)很長,響應(yīng)時(shí)間也會(huì)相應(yīng)地變長),就會(huì)經(jīng)常發(fā)生這種情況,這樣只能使情況變得更糟。如果用戶不再連接,執(zhí)行 ASP 頁面(特別是慢的、大的 ASP 頁面)已沒有任何意義。您可以使用 Response.IsClientConnected 屬性檢查這一情況。如果它返回 False,則應(yīng)調(diào)用 Response.End 并放棄頁的其余部分。事實(shí)上,IIS 5.0 已將這一做法編為程序 - 每當(dāng) ASP 即將執(zhí)行新請(qǐng)求時(shí),它就會(huì)檢查請(qǐng)求在隊(duì)列中已等候了多長時(shí)間。如果已經(jīng)在那里等候了多于 3 秒鐘,ASP 將檢查客戶機(jī)是否仍處于連接狀態(tài),如果沒有連接,就立即終止請(qǐng)求。您可以在配置數(shù)據(jù)庫中使用 AspQueueConnectionTestTime 設(shè)置將超時(shí)時(shí)間由 3 秒調(diào)整為其它值。
如果頁面要花很長時(shí)間才能執(zhí)行完,也可以不時(shí)地檢查 Response.IsClientConnected。當(dāng)啟用了響應(yīng)緩沖時(shí),最好不時(shí)地執(zhí)行 Response.Flush,以用戶知道,正在發(fā)生什么事。
注意 在 IIS 4.0 上,除非先執(zhí)行了 Response.Write,否則 Response.IsClientConnected 就不能正常工作。如果啟用了緩沖,您也必須執(zhí)行 Response.Flush。在 IIS 5.0 上,卻沒有必要這樣做,- Response.IsClientConnected 工作正常。在任何情況下,Response.IsClientConnected 都會(huì)有一些開銷,因此只有在一個(gè)操作至少要花(比方說) 500 毫秒(如果您想維持每秒鐘數(shù)十頁的吞吐量,這是一個(gè)很長的時(shí)間)才使用它。經(jīng)驗(yàn)表明,不要每次重復(fù)執(zhí)行緊密循環(huán)時(shí)都調(diào)用它,如顯示表的許多行時(shí) - 每隔二十或五十行調(diào)用一次可能比較合適。
技巧 17:使用 <OBJECT> 標(biāo)記例示對(duì)象
如果要引用不在所有代碼路徑(特別是服務(wù)器或應(yīng)用程序作用域的對(duì)象)中使用的對(duì)象,使用 Global.asa 中 <object runat=server id=objname> 標(biāo)記聲明它們,而不使用 Server.CreateObject 方法。Server.CreateObject 能立即創(chuàng)建對(duì)象。如果以后不再使用該對(duì)象,您就浪費(fèi)了資源。<object id=objname> 標(biāo)記聲明 objname,但在其方法或?qū)傩缘谝淮问褂靡郧,不?huì)創(chuàng)建 objname。
這又是一個(gè)惰性計(jì)算的例子。
技巧 18:對(duì)于 ADO 和其它組件使用 TypeLib 聲明
當(dāng)使用 ADO 時(shí),開發(fā)人員經(jīng)常加入 adovbs.txt,以訪問 ADO 的各種常量。在要使用常量的每個(gè)頁面中必須包含此文件。此常量文件相當(dāng)大,給每個(gè) ASP 頁面的編譯時(shí)間和腳本大小增加了許多系統(tǒng)開銷。
IIS 5.0 引入了綁定到組件類型庫的功能。這可使您引用類型庫一次,并將其用在每個(gè) ASP 頁面上。每個(gè)頁面不會(huì)產(chǎn)生編譯常量文件的開銷,且組件開發(fā)人員不必建立 VBScript#_include 文件以在 ASP 上使用。
要訪問 ADO TypeLib,將下面一條語句放在 Global.asa 中。
<!-- METADATA NAME=?Microsoft ActiveX Data Objects 2.5 Library?
TYPE=?TypeLib? UUID=?{00000205-0000-0010-8000-00AA006D2EA4}? -->
或
<!-- METADATA TYPE=?TypeLib?
FILE=?C:\Program Files\Common Files\system\ado\msado15.dll? -->
技巧 19: 利用瀏覽器的驗(yàn)證功能
現(xiàn)今的瀏覽器對(duì)一些高級(jí)功能如 XML、DHTML、Java 小程序和遠(yuǎn)程數(shù)據(jù)服務(wù)提供支持。盡可能使用這些功能。所有這些技術(shù)都可以執(zhí)行客戶機(jī)端驗(yàn)證和數(shù)據(jù)緩存,免去了到 Web 服務(wù)器的往返。如果您在運(yùn)行一個(gè)智能瀏覽器,那么瀏覽器就能為您進(jìn)行一些驗(yàn)證(例如,在執(zhí)行 POST 之前,檢查信用卡校驗(yàn)和是否有效)。盡可能使用這一功能。通過減少客戶-服務(wù)器之間的往返,可降低 Web 服務(wù)器上的負(fù)載,并能減少網(wǎng)絡(luò)通信量(雖然發(fā)送到瀏覽器的第一個(gè)頁面可能比較大)以及服務(wù)器訪問的任何后端資源。此外,用戶不必像住常一樣讀取新頁,從而用戶的感覺會(huì)好一些。這樣做并不意味著您可以不進(jìn)行服務(wù)器端驗(yàn)證 - 您還應(yīng)始終進(jìn)行服務(wù)器端驗(yàn)證。這可以防止由于某種原因(如黑客,或?yàn)g覽器不運(yùn)行客戶機(jī)端驗(yàn)證例程)客戶機(jī)產(chǎn)生錯(cuò)誤的數(shù)據(jù)。
人們已經(jīng)進(jìn)行了大量的工作,開發(fā)“獨(dú)立于瀏覽器”的 HTML。正是由于這種憂慮,開發(fā)人員不愿再使用流行的瀏覽器功能,但這些功能本可以改善性能。對(duì)于一些真正的高性能站點(diǎn),必須關(guān)心瀏覽器“訪問”問題,一個(gè)好的策略是優(yōu)化頁面,使其適應(yīng)流行的瀏覽器。使用瀏覽器功能組件,可以在 ASP 中方便地檢測到瀏覽器功能。Microsoft FrontPage 等工具有助于設(shè)計(jì)適合于瀏覽器和指定 HTML 版本的代碼。參見 When is Better Worse?Weighing the Technology Trade-Offs,以了解更進(jìn)一步的討論。