簡介 性能是一個特性
您需要預先設計性能
或是在日後重新編寫應用程序
換句話說
什麼是最大限度優化 Active Server Pages (ASP) 應用程序性能的好策略?
本文為優化 ASP 應用程序和
Visual Basic(R) 腳本編輯器 (VBScript)
提供了許多技巧
對許多陷阱和缺陷進行了討論
本文所列的建議均在 及其他站點上進行了測試
而且工作正常
本文假定您對 ASP 開發有基本的理解
包括對 VBScript 和/或 JScript
ASP Application
ASP Session 和其他 ASP 內部對象(請求
響應和服務器)
ASP 的性能
通常不止取決於 ASP 代碼本身
我們並不想在一篇文章中囊括所有的至理名言
只在最後列出與性能相關的資源
這些鏈接包括 ASP 和非 ASP 主題
包括
ActiveX(R) 數據對象 (ADO)
部件對象模型 (COM)
數據庫和
Internet 信息服務器 (IIS)
配置
這些是我們喜歡的鏈接
務請關注它們
技巧 在 Web 服務器上緩存常用數據 典型的 ASP 頁從後端數據庫檢索數據
然後將結果轉換為超文本標記語言 (HTML)
無論數據庫的速度如何
從內存檢索數據要比從後端數據庫檢索數據快得多
從本地硬盤讀取數據通常也要比從數據庫檢索數據快得多
因此
通常可以通過在 Web 服務器(在內存或磁盤)上緩存數據來改善性能
緩存是典型的空間與時間的折衷
如果恰當地緩存數據
您將看到性能會有驚人的提高
為使緩存發揮效力
它必須保持經常重用的數據
而且重新計算這些數據的代價是昂貴的或比較昂貴的
如果緩存充滿了垃圾數據
則是對存儲器的浪費
不經常變化的數據也是緩存的候選數據
因為您無須擔心數據與數據庫的同步問題
組合框
引用表
DHTML 碎片
可擴展標記語言 (XML) 字符串
菜單項和站點配置變量(包括數據源名稱 (DSN)
Internet 協議 (IP) 地址和 Web 路徑)都是緩存的候選數據
注意
您可以緩存數據的表示而不是數據本身
如果 ASP 頁不經常更改
而且緩存的成本也非常高(例如
整個產品目錄)
請考慮預先生成 HTML
而不是在每次請求時重新繪制
數據應緩存在何處
有哪些緩存策略?數據經常緩存在 Web 服務器內存或 Web 服務器磁盤上
下面兩個技巧討論這些選項
技巧 在 Application 或 Session 對象中緩存常用數據 ASP Application 和 Session 對象為在內存中緩存數據提供了方便的容器
既可以將數據賦予 Application 對象
也可將數據賦予 Session 對象
這些數據在 HTTP 調用中將保留在內存中
Session 數據按用戶存儲
而 Application 數據在所有用戶間共享
何時將數據載入 Application 或 Session?通常
在 Application 或 Session 啟動時加載數據
要在 Application 或 Session 啟動時加載數據
請在下面兩函數中添加相應的代碼
Application_OnStart()
或
Session_OnStart()
這兩個函數應該位於 Global
asa
如果沒有
可以添加這些函數
也可以在第一次需要數據時加載數據
要進行上述操作
請在 ASP 頁中添加一些代碼(或編寫可重用的腳本函數)
這些代碼檢查數據是否存在
並在數據不存在時加載數據
這是稱為遲緩計算的經典性能技術的例子
在您的確需要它之前
不進行計算
請看例子
<%
Function GetEmploymentStatusList
Dim d
d = Application(
EmploymentStatusList
)
If d =
Then
FetchEmploymentStatusList 函數(不顯示)
從 DB 中取出數據
返回數組
d = FetchEmploymentStatusList()
Application(
EmploymentStatusList
) = d
End If
GetEmploymentStatusList = d
End Function
%>
可以為每一塊所需的數據編寫類似的函數
數據應該以什麼格式存儲?任何變量類型均可存儲
因為所有腳本變量是各不相同的
例如
可以存儲字符串
整型或數組
通常
您將以這些變量類型之一存儲 ADO 記錄集的內容
若要獲取 ADO 記錄集衍生的數據
可以手工將數據復制到 VBScript 變量中
每次一個字段
使用一個 ADO 記錄集保留函數 GetRows()
GetString() 或 Save() (ADO
)
會更快更簡便
完整而詳細的內容已超出了本文的范圍
下面的演示函數使用了
GetRows()
來返回記錄集數據的數組
取記錄集
以數組返回
Function FetchEmploymentStatusList
Dim rs
Set rs = createObject(
ADODB
Recordset
)
rs
Open
select StatusName
StatusID from EmployeeStatus
_
dsn=employees;uid=sa;pwd=;
FetchEmploymentStatusList = rs
GetRows()
以數組返回數據
rs
Close
Set rs = Nothing
End Function
對上面示例的進一步改進應當是緩存該列表的 HTML
而不是緩存數組
下面是一個簡單的范例
取記錄集
以
HTML 選項
列表返回
Function FetchEmploymentStatusList
Dim rs
fldName
s
Set rs = createObject(
ADODB
Recordset
)
rs
Open
select StatusName
StatusID from EmployeeStatus
_
dsn=employees;uid=sa;pwd=;
s =
<select name=
EmploymentStatus
>
& vbCrLf
Set fldName = rs
Fields(
StatusName
)
ADO 字段綁定
Do Until rs
EOF
下面一行違背了不要進行字符串連接
但這是可以的
因為我們正在建立高速緩存
s = s &
<option>
& fldName &
</option>
& vbCrLf
rs
MoveNext
Loop
s = s &
</select>
& vbCrLf
rs
Close
Set rs = Nothing
參見盡早釋放
FetchEmploymentStatusList = s
以字符串返回數據
End Function
在正常的情況下
可以在 Application 或 Session 作用域中緩存 ADO 記錄集本身
有兩個警告
ADO 必須為標記的自由線程
必須使用斷開連接的記錄集
如果不能保證滿足這兩個要求
請不要緩存 ADO 記錄集
在下面的非靈活組件和不要緩存連接技巧中
我們將討論在 Application 或 Session 作用域中存儲 COM 對象的危險
如果在 Application 或 Session 作用域中存儲數據
這些數據將一直保留在那兒
直到在程序中改變它
Session 過期或 Web 應用程序重新啟動時為止
數據需要更新如何處理?若要用手工強制更新應用程序數據
可以調用只允許管理員訪問的數據更新 ASP 頁
另外
還可以通過函數
周期地自動刷新數據
下面的示例存儲帶緩存數據的時間戳
在指定時間間隔後刷新數據
<%
未顯示錯誤處理
Const update_INTERVAL =
刷新時間間隔
以秒計
函數返回雇傭狀態列表
Function GetEmploymentStatusList
updateEmploymentStatus
GetEmploymentStatusList = Application(
EmploymentStatusList
)
End Function
定期更新緩存的數據
Sub updateEmploymentStatusList
Dim d
strLastupdate
strLastupdate = Application(
Lastupdate
)
If (strLastupdate =
) Or _
(update_INTERVAL DateDiff(
s
strLastupdate
Now)) Then
注意
此處可能有兩個或多個調用
這是可以的
只不過
產生幾個不必要的取指令罷了(就此有一個工作區)
FetchEmploymentStatusList 函數(不顯示)
從 DB 中取數據
返回一個數組
d = FetchEmploymentStatusList()
更新 Application 對象
用 Application
Lock()
來確保一致的數據
Application
Lock
Application(
EmploymentStatusList
) = d
Application(
Lastupdate
) = CStr(Now)
Application
Unlock
End If
End Sub
其他示例
請參閱具有 Application 數據的最快列表框(英文)
請注意
在 Session 或 Application 對象中緩存大型數組並非上策
在訪問數組元素之前
腳本語言的語法要求建立整個數組的臨時副本
例如
如果在 Application 對象中緩存了將美國郵政編碼映射到本地氣象站的字符串數組
該字符串數組有
個元素
ASP 在找出一個字符串之前
必須將所有
個氣象站復制到臨時數組中
在這種情況下
建立帶自定義方法的自定義組件
來存儲氣象站
或使用一個字典組件
也許更好
請不要在倒洗澡水時把孩子一同倒掉
對這種觀點的一個新的注解是
數組提供了對內存中相鄰關鍵
數據對的快速查找和存儲
索引字典比索引數組要慢
您應該根據具體情況選擇能夠提供最佳性能的數據結構
技巧 在 Web 服務器磁盤上緩存數據和 HTML 有時
數據過多不能在內存中進行緩存
過多
是一種定性的判斷
它取決於打算消耗的內存量
還有緩存項的數量和這些項的檢索頻率
總之
如果有過多的數據要在內存中緩存
請考慮以文本或 XML 文件的形式
在 Web 服務器的硬盤上緩存數據
可以將在磁盤上緩存數據和在內存中緩存數據組合起來
為站點建立最優的緩存策略
注意
在度量單個 ASP 頁的性能時
在磁盤上檢索數據不一定比從數據庫中檢索數據快
但是
緩存減輕了數據庫和網絡的負荷
在高負荷情況下
這將明顯提高總體通信量
在查詢成本很高時緩存查詢的結果
緩存便非常有效
例如多表聯合或復雜的存儲過程
或緩存大型的結果集
按照
From:http://tw.wingwit.com/Article/program/net/201311/11646.html