二十八條改善ASP效能和外觀的技巧 三

2021-04-12 20:33:19 字數 2746 閱讀 4287

變數 foo 被解析為全域性物件。 

變數 bar 被解析為 foo 的成員。這實際就是一次 com 方法呼叫。 

變數 blah 被解析為 foo.bar 的成員。這又是一次 com 方法呼叫。 

變數 qaz 被解析為 foo.bar.blah 的成員。沒有錯,這還是一次 com 方法呼叫。 

呼叫 foo.bar.blah.quaz(1)。再一次 com 方法呼叫。懂了嗎? 

再次執行步驟 1 至步驟 3 以解析 baz。系統並不知道呼叫 qaz 是否改變物件模型,因此必須再次執行

步驟 1 至 3 以解析 baz。 

將 baz 解析為 foo.bar.blah 的成員。賦予屬性。 

再次執行步驟 1 至步驟 3 以解析 zaq。 

再次執行步驟 1 至步驟 3 以解析 abc。 正如您可看到的,效率相當差(且慢)。以 vbscript 寫此**的快速方法是:

set myobj = foo.bar.blah 』 do the resolution of blah oncemyobj.baz = myobj.qaz(1)if myobj.zaq = myobj.abc then 』...

如果您使用 vbscript 5.0 或更高版本,您可以使用 with 語句寫此**:

with foo.bar.blah.baz = .qaz(1)if .zaq = .abc then 』......end with

<%next while not rs.eof%><% for each fld in rs.fields %><% = fld.value %>

<% next 

<% rs.movenext wend %>下面的**更有效,每一行對響應流有一次寫操作。所有的**都包含在乙個 vbscript 塊內:

<%for each fld in rs.fieldsresponse.write (?? & fld.name & ?? & vbcrlf)nextwhile not rs.eofresponse.write (??)for each fld in rs.fields %>response.write(?? & fld.value & ?? & vbcrlf)nextresponse.write ??wend%>

當禁用響應緩衝時,這一技巧的效果特別大。最好啟用響應緩衝,然後看批處理 response.write 是否有助於提高效能。 (在這一特定舉例中,建立表主體的巢狀迴圈 (while not rs.eof...) 可以用仔細構建的 getstring 呼叫來替代。)技巧 16:如果頁面需要很長時間才能完成,那麼執行前使用 response.isclientconnected如果使用者性急,他們可能會在您開始執行他們的請求之前,就會放棄 asp 頁面。如果他們單擊重新整理或移到伺服器上的另乙個頁面,在 asp 請求佇列的末尾就有乙個新的請求等候,在佇列的中間有乙個斷開連線的請求。當伺服器的負載很高時(因此請求佇列就會很長,響應時間也會相應地變長),就會經常發生這種情況,這樣只能使情況變得更糟。如果使用者不再連線,執行 asp 頁面(特別是慢的、大的 asp 頁面)已沒有任何意義。您可以使用 response.isclientconnected 屬性檢查這一情況。如果它返回 false,則應呼叫 response.end 並放棄頁的其餘部分。事實上,iis 5.0 已將這一做法編為程式 - 每當 asp 即將執行新請求時,它就會檢查請求在佇列中已等候了多長時間。如果已經在那裡等候了多於 3 秒鐘,asp 將檢查客戶機是否仍處於連線狀態,如果沒有連線,就立即終止請求。您可以在配置資料庫中使用 aspqueueconnectiontesttime 設定將超時時間由 3 秒調整為其它值。 如果頁面要花很長時間才能執行完,也可以不時地檢查 response.isclientconnected。當啟用了響應緩衝時,最好不時地執行 response.flush,以使用者知道,正在發生什麼事。 注意 在 iis 4.0 上,除非先執行了 response.write,否則 response.isclientconnected 就不能正常工作。如果啟用了緩衝,您也必須執行 response.flush。在 iis 5.0 上,卻沒有必要這樣做,- response.isclientconnected 工作正常。在任何情況下,response.isclientconnected 都會有一些開銷,因此只有在乙個操作至少要花(比方說) 500 毫秒(如果您想維持每秒鐘數十頁的吞吐量,這是乙個很長的時間)才使用它。經驗表明,不要每次重複執行緊密迴圈時都呼叫它,如顯示表的許多行時 - 每隔二十或五十行呼叫一次可能比較合適。技巧 17:使用 標記例示物件如果要引用不在所有**路徑(特別是伺服器或應用程式作用域的物件)中使用的物件,使用 global.asa 中 標記宣告它們,而不使用 server.createobject 方法。server.createobject 能立即建立物件。如果以後不再使用該物件,您就浪費了資源。標記宣告 objname,但在其方法或屬性第一次使用以前,不會建立 objname。 這又是乙個惰性計算的例子。 

技巧 18:對於 ado 和其它元件使用 typelib 宣告當使用 ado 時,開發人員經常加入 adovbs.txt,以訪問 ado 的各種常量。在要使用常量的每個頁面中必須包含此檔案。此常量檔案相當大,給每個 asp 頁面的編譯時間和指令碼大小增加了許多系統開銷。 iis 5.0 引入了繫結到元件型別庫的功能。這可使您引用型別庫一次,並將其用在每個 asp 頁面上。每個頁面不會產生編譯常量檔案的開銷,且元件開發人員不必建立 vbscript#_include 檔案以在 asp 上使用。 要訪問 ado typelib,將下面一條語句放在 global.asa 中。

二十八條改善 ASP 效能和外觀的技巧

技巧 15 批處理內嵌指令碼和 response.write 語句 技巧 16 如果頁面需要很長時間才能完成,那麼執行前使用 response.isclientconnected 技巧 17 使用 標記例示物件 技巧 18 對於 ado 和其它元件使用 typelib 繫結 技巧 19 利用瀏覽器的...

二十八 模組

模組 在電腦程式的開發過程中,隨著程式 越寫越多,在乙個檔案裡 就會越來越長,越來越不容易維護。為了編寫可維護的 我們把很多函式分組,分別放到不同的檔案裡,這樣,每個檔案包含的 就相對較少,很多程式語言都採用這種組織 的方式。在python中,乙個.py檔案就稱之為乙個模組 module 使用模組有...

Lua程式設計(二十八)

lua語言會在執行源 之前先對其進行預編譯。生成預編譯檔案 也被稱為二進位制檔案,binary chunk 的最簡單方式是,使用標準發行班中附帶的luac程式。luac o prog.lc prog.lua上述命令會建立檔案prog.lua的預編譯版本prog.lc。lua解析器會像執行普通lua ...