狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

如何增強(qiáng)ASP程序性能

admin
2011年4月24日 0:39 本文熱度 2848

簡介

  性能是一個(gè)很重要的特征。你需要事先設(shè)計(jì)好性能指標(biāo),否則日后就要為此重新編寫程序。就是說:要設(shè)想好怎樣最佳化地執(zhí)行ASP程序?

  本文提出了一些優(yōu)化ASP應(yīng)用和VBScript的技巧,許多技巧和缺陷都經(jīng)過了研討。這里列出的建議已經(jīng)在http://www.microsoft.com 和其他站點(diǎn)上進(jìn)行了測(cè)試,都工作得非常好。本文假設(shè)你具備ASP開發(fā)的基本知識(shí),包括VBScript或者JScript,ASP應(yīng)用程序,ASP Session,以及其他ASP內(nèi)置對(duì)象(Request,Response和Server)。

  通常,ASP的執(zhí)行性能遠(yuǎn)遠(yuǎn)不僅僅依賴ASP代碼本身!在本文的尾部列出了與性能相關(guān)的資源,它們含概了ASP和非ASP的部分,包含ActiveX Data Objects(ADO),Component Object Model(COM),數(shù)據(jù)庫(Database),以及Internet信息服務(wù)器(IIS)的配置。除了這些,還有一些非常好的鏈接值得你一看。

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

  典型的情況是:ASP頁面從后臺(tái)存儲(chǔ)中取回?cái)?shù)據(jù),然后以超文本標(biāo)記語言(HTML)的形式形成結(jié)果。不管數(shù)據(jù)庫的速度如何,從內(nèi)存中取回?cái)?shù)據(jù)要比從后臺(tái)存儲(chǔ)設(shè)備中快得多。從本地硬盤讀取數(shù)據(jù)通常也非常快。所以,提高性能可以通過緩存服務(wù)器上的數(shù)據(jù)來實(shí)現(xiàn),無論是將數(shù)據(jù)緩存在內(nèi)存中,或者本地硬盤中。

  緩存是經(jīng)典的“空間換時(shí)間”的折中方式。如果緩存得恰當(dāng),就可以看到顯著的性能提升。為了讓緩存有效,必須保證緩存數(shù)據(jù)是經(jīng)常要重用的,而且也是計(jì)算起來繁瑣的。裝滿陳舊數(shù)據(jù)的緩存是對(duì)內(nèi)存的浪費(fèi)。

  不經(jīng)常改變的數(shù)據(jù)是緩存的較好對(duì)象,因?yàn)椴恍枰S時(shí)考慮這些數(shù)據(jù)更新后的同步操作。組合框、參考表格、DHTML代碼、擴(kuò)展標(biāo)記語言串、菜單以及站點(diǎn)配置變量(包括數(shù)據(jù)源名字DSNS,Internet協(xié)議地址IP以及Web路徑)都是很好的緩存對(duì)象。注意:要緩存數(shù)據(jù)表達(dá)式而不是數(shù)據(jù)本身。如果一個(gè)ASP頁面經(jīng)常變化并且很費(fèi)力去緩存(比如整個(gè)產(chǎn)品目錄),就要考慮預(yù)產(chǎn)生HTML,而不是每次發(fā)生請(qǐng)求時(shí)再描述它。

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

  ASP中的Application和Session對(duì)象是在內(nèi)存中緩存數(shù)據(jù)的便利容器。你可以將數(shù)據(jù)賦值給Application和Session對(duì)象,這些數(shù)據(jù)在HTTP調(diào)用期間將一直保持在內(nèi)存中。Session中的數(shù)據(jù)是為每一個(gè)用戶服務(wù)的,Application中的數(shù)據(jù)是所有用戶共享的。

  何時(shí)需要在Application和Session中裝入數(shù)據(jù)?通常,當(dāng)應(yīng)用程序啟動(dòng)或者會(huì)話開始時(shí),數(shù)據(jù)就被裝入了。為了在這時(shí)裝入數(shù)據(jù),在Application OnStart()或者Session OnStart()中分別添加適當(dāng)?shù)拇a。這些函數(shù)位于文件Global.asa中,如果原來不存在,就添加上。也可以在數(shù)據(jù)首次需要的時(shí)候調(diào)入,在ASP頁面中添加代碼,檢查數(shù)據(jù)是否存在,如果沒有發(fā)現(xiàn),就調(diào)入它。這里有一個(gè)例子,它代表了被稱為“l(fā)azy evalution”的經(jīng)典性能處理技術(shù):直到需要時(shí),再去計(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
%>

對(duì)于不同的數(shù)據(jù),可以編寫類似的函數(shù)代碼。

  數(shù)據(jù)應(yīng)該按什么格式保存?任何變量類型都可以,因?yàn)樗械哪_本變量都是不同的。比如說,可以保存為字符串、整型或者數(shù)據(jù)。通常,將ADO記錄集的內(nèi)容存儲(chǔ)到這些變量類型中一個(gè)。為了從ADO記錄集中取出數(shù)據(jù),需要手工地拷貝數(shù)據(jù)到VBScript變量中,每次一個(gè)字段。使用任意一個(gè)ADO記錄集的函數(shù)functions GetRows(),GetString() 或者 Save() (ADO 2.5)都非常得快速而且簡單,這里有個(gè)函數(shù),描述了如何使用GetRows()返回記錄集數(shù)據(jù)的數(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

上述代碼的一個(gè)更深的技巧是為列表緩存了HTML。下面是個(gè)簡單的例子:

' 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 = "<select name=""EmploymentStatus">" & vbCrLf
 Set fldName = rs.Fields("StatusName") ' ADO Field Binding
 Do Until rs.EOF
 ' Next line violates Don't Do String Concats,
 ' but it's OK because we are building a cache
 s = s & " <option>" & fldName & "</option>" & vbCrLf
 rs.MoveNext
 Loop
 s = s & "</select>" & vbCrLf
 rs.Close
 Set rs = Nothing ' See Release Early
 FetchEmploymentStatusList = s ' Return data as a String
End Function

在合適的環(huán)境下,可以在Application或者Session中緩存ADO記錄集本身,但是有2點(diǎn)提示:



  • ADO必須是自由線程標(biāo)記的
  • 需要使用disconnected recordset方式

  如果不能保證上述2個(gè)條件,就不要緩存ADO記錄集,因?yàn)檫@會(huì)產(chǎn)生很大的危險(xiǎn)性。

  當(dāng)在Application或Session中保存數(shù)據(jù)后,數(shù)據(jù)將一直保持,除非程序改變它、Session變量到期或者Web應(yīng)用程序重新啟動(dòng)。如果數(shù)據(jù)需要更新,怎么辦?可以調(diào)用只有管理員才能訪問的ASP頁面來更新數(shù)據(jù),或者,通過函數(shù)周期性的自動(dòng)更新數(shù)據(jù)。下面的例子中,與緩存數(shù)據(jù)一起保存了時(shí)鐘標(biāo)記,過一段時(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") = d
 Application("LastUpdate") = CStr(Now)
 Application.Unlock
 End If
End Sub

  必須意識(shí)到,在Session或者Application對(duì)象中緩存大容量的數(shù)組不是一個(gè)好的方法。存取數(shù)組中任何元素前,腳本語言的規(guī)則要求首先要建立整個(gè)數(shù)組的臨時(shí)備份。比如,如果在Application對(duì)象中緩存一個(gè)100,000個(gè)元素的數(shù)組,其中包含U.S.郵政編碼與本地氣象站的對(duì)應(yīng)關(guān)系,ASP就必須首先拷貝所有100,000個(gè)氣象站信息到臨時(shí)數(shù)組中,然后才能選擇其中一個(gè)字符串進(jìn)行處理。在這種情況下,創(chuàng)建一個(gè)定制的組件,編寫一個(gè)方法存儲(chǔ)氣象站信息,是非常好的方法。

技巧3:在Web服務(wù)器磁盤上緩存數(shù)據(jù)和HTML頁面

  有時(shí)候,有“許多”數(shù)據(jù)要在內(nèi)存中緩存。“許多”是相對(duì)而言的,它取決于能消耗多少內(nèi)存、緩存項(xiàng)目的數(shù)量以及取回?cái)?shù)據(jù)的頻度。任何情況下,如果需要在內(nèi)存中緩存大量的數(shù)據(jù),請(qǐng)考慮以text或者XML文件格式在Web服務(wù)器硬盤上做緩存。當(dāng)然,也可以混合使用硬盤緩存數(shù)據(jù)以及內(nèi)存緩存數(shù)據(jù),從而達(dá)到最佳緩存。

  注意:當(dāng)測(cè)試一個(gè)單一ASP頁面的性能時(shí),從磁盤取回?cái)?shù)據(jù)不一定比從網(wǎng)絡(luò)數(shù)據(jù)庫中取回?cái)?shù)據(jù)快,但是緩存減少了網(wǎng)絡(luò)數(shù)據(jù)庫的調(diào)用。在大規(guī)模調(diào)用時(shí),這將明顯地提高網(wǎng)絡(luò)的吞吐能力。緩存一個(gè)費(fèi)時(shí)的查詢結(jié)果是非常有用的,比如對(duì)于一個(gè)復(fù)雜的存儲(chǔ)過程,或者大量的結(jié)果數(shù)據(jù)。

  ASP和COM提供了幾種建立基于磁盤緩沖配置的工具。ADO記錄集的Save()和 Open()函數(shù)負(fù)責(zé)保存和調(diào)入磁盤上的記錄集。另外還有一些組件:



  • Scripting.FileSystemObject 允許你創(chuàng)建、讀取和寫文件
  • MSXML,Microsoft XML 解析器隨Internet Explorer而來,支持保存和裝入XML文檔
  • LookupTable對(duì)象(比如在MSN上使用)是從磁盤調(diào)入簡單列表的很好選擇。

  最后,考慮緩存磁盤數(shù)據(jù)的表達(dá)式,而不是數(shù)據(jù)本身。預(yù)處理的HTML可以存儲(chǔ)為.htm或者.asp文件,鏈接直接指向它們。使用諸如XBuilder或者M(jìn)icrosoft SQL Server Internet發(fā)布類的商業(yè)工具,能夠自動(dòng)處理這些過程。而且,也可以在.asp文件中包含HTML程序片斷。同樣,也可使用FileSystemObject從磁盤上讀取HTML文件,或者使用XML for early rendering來做這個(gè)工作。

技巧4:避免在Application或Session對(duì)象中緩存非輕快型組件

  在Application或Session對(duì)象中緩存數(shù)據(jù)是一個(gè)很好的方法,但是,緩存COM對(duì)象卻有嚴(yán)重的缺陷。在Application或Session對(duì)象中緩存經(jīng)常使用的COM對(duì)象這個(gè)工作是非常吸引人的,但是很不幸,許多COM對(duì)象,包括用Visual Basic 6.0或者以前版本編寫的對(duì)象組件,當(dāng)存儲(chǔ)在Application或Session對(duì)象中后,都會(huì)產(chǎn)生嚴(yán)重的瓶頸問題。

  特別地,當(dāng)組件編寫得不是很輕巧時(shí),就極可能產(chǎn)生瓶頸問題。一個(gè)輕型組件就是標(biāo)記了ThreadingModel=Both的組件,其中合計(jì)了自由線程的排列(FTM),或者標(biāo)記了ThreadingModel=Neutral(Neutral模式是Windows2000和COM+中的新特征)。下面的組件不是輕型的:



  • Free-threaded組件(除非被集合成FTM)
  • Apartment-threaded組件
  • Single-threaded組件

  Configured components不是輕型組件,除非它們是Neutral-threaded的。Apartment-threaded組件和其他非輕型組件在頁范圍內(nèi)工作得很好,就是說,它們是在一個(gè)單一ASP頁面中創(chuàng)建并釋放的。

  如果緩存了非輕型組件,將會(huì)發(fā)生什么錯(cuò)誤?在Session對(duì)象中緩存的非輕型組件將會(huì)“鎖住”會(huì)話。ASP維護(hù)著一個(gè)響應(yīng)請(qǐng)求的工作線程池,通常,新的請(qǐng)求被第一個(gè)可用的工作線程控制。如果一個(gè)會(huì)話被鎖在一個(gè)線程中,那么請(qǐng)求就被迫等待到相關(guān)的線程變?yōu)榭捎谩_@里有一個(gè)類比:你前往一個(gè)超級(jí)市場(chǎng),挑選了一些食品,并在3號(hào)付款臺(tái)付款。從那以后,只要在那個(gè)超級(jí)市場(chǎng)買食品付款,你就會(huì)經(jīng)常到3號(hào)付款臺(tái)去,雖然其他的付款臺(tái)人少些甚至沒有人。

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

  緩存ADO連接通常不是一個(gè)好的策略。如果一個(gè)連接對(duì)象被存儲(chǔ)在Application對(duì)象中,并在所有的頁面使用,那么所有頁面將會(huì)爭奪該連接的使用。如果存儲(chǔ)在ASP Session對(duì)象中,那么將要為每一個(gè)用戶都打開數(shù)據(jù)庫連接。這將挫敗連接池的使用意圖,并且在Web服務(wù)器和數(shù)據(jù)庫上都施加了不必要的高代價(jià)壓力。

  為了替代緩存數(shù)據(jù)庫連接,可以在使用ADO的每個(gè)ASP頁面中創(chuàng)建并釋放ADO對(duì)象。這將非常有效,因?yàn)镮IS擁有內(nèi)建的數(shù)據(jù)庫連接池。更準(zhǔn)確地說,IIS自動(dòng)處理OLEDB和ODBC連接池,這將保證在每個(gè)頁面創(chuàng)建并且釋放連接的工作高效進(jìn)行。

  由于連接的記錄集存儲(chǔ)了數(shù)據(jù)庫連接的參考,所以,不要在Application或Session對(duì)象中緩存連接的記錄集。然而,可以安全地緩存disconnected類型的記錄集,它們并不保存相應(yīng)數(shù)據(jù)庫連接的參考。為了斷開記錄集,執(zhí)行下面2步:

 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)于連接池的信息請(qǐng)?jiān)L問 ADO and SQL Server。


 


技巧6:聰明地使用Session對(duì)象

  Session在繁忙站點(diǎn)上使用時(shí)有幾個(gè)缺陷。繁忙的意思是:站點(diǎn)上每秒有上百的頁面被請(qǐng)求,或者同時(shí)有上千的訪問用戶。這個(gè)技巧對(duì)于那些要求水平擴(kuò)展強(qiáng)的站點(diǎn)非常重要,也就是指這些站點(diǎn):它們利用多個(gè)服務(wù)器完成數(shù)據(jù)裝載或者處理大量容錯(cuò)。對(duì)于小型站點(diǎn),比如內(nèi)部網(wǎng)Intranet,Session是非常值得提倡的。

  再次重申,ASP自動(dòng)地為每一個(gè)首次點(diǎn)擊Web服務(wù)器的用戶創(chuàng)建一個(gè)Session,每一個(gè)Session占有大約10KB的內(nèi)存,生存期默認(rèn)是20分鐘。

  使用Session最大的問題不是性能,而是擴(kuò)展性,Session不能跨越多個(gè)Web服務(wù)器,一旦在一個(gè)服務(wù)器上創(chuàng)建了Session,它的數(shù)據(jù)就駐留在那里。這意味著,如果在Web上使用Session,你就得為每一個(gè)直接訪問存放Session服務(wù)器的用戶請(qǐng)求設(shè)計(jì)一個(gè)策略。這就是將用戶“粘”在Web服務(wù)器上,術(shù)語“sticky sessions”就來源于此。如果Web服務(wù)器遇到障礙,“Stuck”用戶就會(huì)丟失他們的Session狀態(tài),因?yàn)镾ession不保留在磁盤上。

  執(zhí)行粘性session的策略包括硬件與軟件解決方式,比如windows2000高級(jí)服務(wù)器中的 Network Load Balancing 以及Cisco公司的Local Director,但換取這些要犧牲一定的擴(kuò)展性。

  Application對(duì)象也不能跨越服務(wù)器。如果需要在Web群中共享并更新Application數(shù)據(jù),就需要使用后臺(tái)數(shù)據(jù)庫。然而,只讀Application數(shù)據(jù)在Web群中仍然很有用。

  許多對(duì)任務(wù)要求嚴(yán)格的站點(diǎn)都要設(shè)立至少2個(gè)Web服務(wù)器,所以在設(shè)計(jì)嚴(yán)格任務(wù)的應(yīng)用程序時(shí),就需要執(zhí)行“sticky sessions”,或者簡單地避免使用Session,同時(shí)也可以采取其他保存用戶狀態(tài)到獨(dú)立Web服務(wù)器的管理技術(shù)。

  如果不使用Session,一定要確認(rèn)將它們關(guān)閉,這可以通過Internet服務(wù)管理器實(shí)現(xiàn)。如果決定使用Session,可以通過幾種方法來最小化它們的影響。

  可以將不需要Session的內(nèi)容(比如幫助畫面,訪問者區(qū)域,等等)移動(dòng)到關(guān)閉Session的獨(dú)立ASP應(yīng)用程序中。在基礎(chǔ)頁面上,可以給ASP一個(gè)指示,讓它不需要使用Session。將下面的代碼直接加入到ASP頁面的頭部:
  

<% @EnableSessionState=False %>

  使用這個(gè)指示的一個(gè)很好的解釋是在框架結(jié)構(gòu)中Session創(chuàng)建了一個(gè)有趣的問題。ASP確保在一個(gè)時(shí)刻只有一個(gè)來自Session的請(qǐng)求被執(zhí)行,這就確保了如果瀏覽器為單個(gè)用戶請(qǐng)求多個(gè)頁面時(shí),只有一個(gè)ASP請(qǐng)求在那時(shí)能夠接受Session,如此就避免了存取Session對(duì)象時(shí)的多線程問題。很不幸,在框架結(jié)構(gòu)中的所有頁面將按照連續(xù)的順序顯示出來,一個(gè)接一個(gè),而不是同時(shí),所以用戶為了看到整個(gè)框架必須要等很長時(shí)間。規(guī)則是:如果一定的框架頁面沒有使用Session,就一定要告訴ASP直接使用@EnableSessionState=False。

  除了使用Session對(duì)象,還有許多其他管理會(huì)話狀態(tài)的選擇。對(duì)于小數(shù)量的狀態(tài)(小于4KB),我們通常建議使用cookie、查詢字符串變量以及表單隱藏域。對(duì)于象購物車一樣的大數(shù)量數(shù)據(jù),后臺(tái)數(shù)據(jù)庫是最合適的選擇。

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

  如果要編寫很多VBScript或者JScript,為了提個(gè)性能,可以將代碼編寫成COM對(duì)象并且編譯使用。編譯代碼基本上比解釋性代碼運(yùn)行快許多,編譯組件對(duì)象可通過“early binding”存取其他COM對(duì)象,這比在腳本中調(diào)用組件要有效。

這么做有許多優(yōu)點(diǎn):



  • COM對(duì)象有益于從商業(yè)規(guī)則中獨(dú)立出表達(dá)式規(guī)則
  • COM對(duì)象使代碼重用變?yōu)榭赡?
  • 許多開發(fā)者發(fā)現(xiàn)用VB,C++或者Visual J++編寫程序,比ASP更容易調(diào)試

  COM對(duì)象也有缺點(diǎn),包括初始開發(fā)時(shí)間和對(duì)不同編程技巧的需要。注意將少量ASP代碼做成COM對(duì)象組件不會(huì)有好處,反而可能導(dǎo)致性能的損失,從而失去了編譯代碼的優(yōu)勢(shì)。怎樣組合使用ASP腳本和COM對(duì)象達(dá)到最佳性能是一個(gè)測(cè)試的問題。我們注意到微軟公司已經(jīng)大規(guī)模在Windows 2000/IIS 5.0上提高了腳本與ADO的性能,由此,隨著IIS5.0版本的引進(jìn),減少了編譯代碼的性能優(yōu)勢(shì)。

技巧8:使用Option Explicit

  要在ASP文件中使用Option Explicit定義,并且放置到ASP文件的頭部,從而強(qiáng)迫開發(fā)者在使用前聲明所有的變量。許多程序員都認(rèn)為這在應(yīng)用程序調(diào)試時(shí)非常有用,因?yàn)樗苊饬水a(chǎn)生錯(cuò)誤類型變量以及偶然創(chuàng)建新變量的可能。

也許更重要的是,聲明的變量要大大快于非聲明變量。

技巧9:拷貝經(jīng)常使用的數(shù)據(jù)到腳本變量中

  在ASP中存取COM對(duì)象時(shí),應(yīng)該拷貝經(jīng)常使用的對(duì)象數(shù)據(jù)到腳本變量中,這樣就減少了對(duì)COM對(duì)象的方法調(diào)用。這些調(diào)用要比存取腳本變量相對(duì)來說費(fèi)時(shí)費(fèi)力。當(dāng)存取Collection和Dictionary對(duì)象時(shí),使用這項(xiàng)技巧也減少了昂貴的查找操作。

  通常,如果要不止一次地存取對(duì)象數(shù)據(jù),就應(yīng)將數(shù)據(jù)放入腳本變量中,對(duì)象數(shù)據(jù)主要也就是Request變量(表單和查詢字符串變量)。比如,站點(diǎn)要傳遞一個(gè)叫做UserID的查詢字符串變量,假設(shè)它將在一個(gè)特殊頁面被引用12次,那么不需要調(diào)用Request(“UserID”)12次,只要在ASP頁面的頭部分配給UserID一個(gè)變量,然后在頁面中使用它,這樣做就節(jié)省了11次COM方法的調(diào)用。

  實(shí)際中,存取COM屬性或方法是很昂貴的,下面的例子展示了通用代碼:

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

上面的代碼執(zhí)行后,發(fā)生以下事情:

1、變量Foo被當(dāng)作全局對(duì)象
2、變量bar被當(dāng)作Foo的一員
3、變量blah被當(dāng)作Foo.bar的一員
4、變量qaz被當(dāng)作Foo.bar.blah的一員
5、調(diào)用Foo.bar.blah.quaz(1)
6、再執(zhí)行步驟1到3分解baz
7、分解baz做為Foo.bar.blah的一員
8、再執(zhí)行步驟1到3分解zaq
9、再執(zhí)行步驟1到3一次分解abc

如上所示,這非常沒有效率并且很慢。更快的方法是用VBScript編寫代碼,如下:

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語句編寫:

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


注意:這個(gè)技巧也可以應(yīng)用在VB編程中。

技巧10:避免再定義數(shù)組

  爭取不要再定義數(shù)組。考慮到性能問題,如果機(jī)器的物理內(nèi)存大小不夠,最好按最差情況或者最佳情況設(shè)置數(shù)組的初始尺寸,需要時(shí)再重新定義。

下面的代碼展示了Dim和Redim的使用:

< %
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"
% >

  簡單地定義數(shù)組初始尺寸為合適的大小是非常好的,而不要用Redim加大數(shù)組。這么做也許浪費(fèi)了一些內(nèi)存(如果沒有完全地使用空間),但是贏得了速度。


 


技巧11:使用Response Buffering

  通過打開“response buffering”可以緩沖一個(gè)值得輸出的整個(gè)頁面內(nèi)容,這將最小化輸出到瀏覽器的數(shù)據(jù)量,從而提高了整體性能。每一次輸出都耗費(fèi)許多,所以寫得越少,效果越好。TCP/IP在發(fā)送少量大的數(shù)據(jù)包時(shí),要比發(fā)送大量小的數(shù)據(jù)包工作效率高,因?yàn)樗锹賳?dòng)并不斷發(fā)送的。

  有2種方法打開Response Buffering。首先,可以使用Internet Services Manager為整個(gè)應(yīng)用程序打開response buffering,這是推薦的方式,而且在IIS4.0和IIS5.0中,默認(rèn)狀態(tài)下,response buffering是打開的。其次,在每一頁面上,可以在頭部放置如下代碼開打開response buffering:

< % Response.Buffer = True % >

  這段代碼必須在任何數(shù)據(jù)輸出到瀏覽器前被執(zhí)行(就是說,在任何html內(nèi)容顯示前和在任何cookie被設(shè)置前)。通常情況下,為整個(gè)應(yīng)用程序打開response buffering是很好的方案,這么做后就不用在每個(gè)頁面頭部設(shè)置如上的代碼。

  關(guān)于打開response buffering的一個(gè)通用問題是:用戶必須要等待整個(gè)頁面全部產(chǎn)生后,才能看到內(nèi)容。對(duì)于一個(gè)長時(shí)間運(yùn)行的頁面來說,可以設(shè)置Response.Buffer=False關(guān)閉緩沖。然后,好的策略是利用Response.Flush方法,它將輸出所有已被ASP描述的HTML內(nèi)容到瀏覽器。比如,在描述了一個(gè)1,000行表格的100行后,ASP就可以使用Response.Flush來強(qiáng)迫輸出這100行的內(nèi)容到瀏覽器,這時(shí)用戶就可以看到前100行數(shù)據(jù),同時(shí)其余的行數(shù)據(jù)正在準(zhǔn)備生成。

  注意,關(guān)于上面的1,000行表格輸出的例子,對(duì)于一些瀏覽器器來說,除非遇到< /table >標(biāo)記,它們不會(huì)輸出表格的任何內(nèi)容。如果這樣,可以將表格分割成許多含有少量行的多個(gè)表格,然后在每一個(gè)表格產(chǎn)生后,調(diào)用Response.Flush輸出。新版的Internet Explorer在整個(gè)表格下載后才顯示內(nèi)容,并且,如果定義了表格的列寬度,生成表格的速度將特別快。

關(guān)于打開response buffering的另外一個(gè)問題是:當(dāng)生成非常大的頁面時(shí),將消耗非常大的服務(wù)器內(nèi)存。

技巧12:批處理單行腳本和Response.Write命令

  VBScript語法< % = expression % >的意思是輸出expression的數(shù)值。如果response buffering沒有打開,每個(gè)這樣的語句將按照許多小數(shù)據(jù)包的形式輸出數(shù)據(jù)到瀏覽器,這將降低程序性能。因此,請(qǐng)使用下面的技巧:替換緊挨著的多個(gè)一行表達(dá)式調(diào)用為一個(gè)調(diào)用,用Response.Write名稱輸出。比如,在下面的例子中,對(duì)于每行每個(gè)字段的輸出,只有一個(gè)寫操作:

<table>
<% For Each fld in rs.Fields %>
 <th><% = fld.Name %></th>
<%
Next 
While Not rs.EOF
%>
 <tr>
 <% For Each fld in rs.Fields %>
 <td><% = fld.Value %></td>
 <% Next 
 </tr>
 <% rs.MoveNext 
Wend %>
</table>

下面是更有效率的代碼,每行一個(gè)輸出:

<table>
<%
 For each fld in rs.Fields
 Response.Write ("<th>" & fld.Name & "</th>" & vbCrLf)
 Next
 While Not rs.EOF
 Response.Write ("<tr>")
 For Each fld in rs.Fields %>
 Response.Write("<td>" & fld.Value & "</td>" & vbCrLf)
 Next
 Response.Write "</tr>"
 Wend
%>
</table>

  當(dāng)response buffering關(guān)閉時(shí),這個(gè)技巧非常得有用。最好是打開response buffering,這樣就可以看到批量的Response.Wwrite是如何提高了程序性能。

技巧13:使用< OBJECT >標(biāo)記引用對(duì)象

  如果需要引用除代碼路徑外的對(duì)象(尤其是服務(wù)器、Application范圍的對(duì)象),請(qǐng)?jiān)贕lobal.asa文件中使用
< object runat=server id=objname >標(biāo)記來定義它們,而不要使用Server.CreateObject方法。使用Server.CreateObject方法可以立即創(chuàng)建對(duì)象,這樣如果隨后不使用它,就浪費(fèi)了資源。使用
< object id=objname >標(biāo)記可以定義對(duì)象objname,但是直到它的屬性或者方法首次使用時(shí),objname才實(shí)際創(chuàng)建。

技巧14:避免在循環(huán)中串聯(lián)字符串

許多人在循環(huán)中建立一個(gè)字符串,就象下面的樣子:

s = "<table>" & vbCrLf
For Each fld in rs.Fields
 s = s & " <th>" & fld.Name & "</th> "
Next
 
While Not rs.EOF
 s = s & vbCrLf & " <tr>"
 For Each fld in rs.Fields
 s = s & " <td>" & fld.Value & "</td> "
 Next
 s = s & " </tr>"
 rs.MoveNext
Wend
 
s = s & vbCrLf & "</table>" & vbCrLf
Response.Write s

  這存在幾個(gè)問題。首先是重復(fù)的連接字符串消耗二次方的時(shí)間,而且,運(yùn)行的時(shí)間與計(jì)算的字段數(shù)量也是平方的關(guān)系。下面的簡單例子更清楚地說明這一點(diǎn):

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

  在第1層循環(huán)時(shí),S的值是“A”;第2層循環(huán)時(shí),VBScript要重新分配字符串,拷貝了2個(gè)字符(“AB”)到S中;第3層循環(huán)時(shí),需要再重新分配并且拷貝3個(gè)字符到S中。在第N層循環(huán)時(shí),就需要重新分配并拷貝N個(gè)字符到S中。那就是1+2+3+...+N的總和,也就是N*(N+1)/2個(gè)拷貝。

  在上面的記錄集例子中,如果有100個(gè)記錄和5個(gè)字段,內(nèi)部循環(huán)就要執(zhí)行100*5=500次,并且,完成所有拷貝和再分配任務(wù)的時(shí)間將接近500*500=250,000。這還是一個(gè)適當(dāng)尺寸記錄集的拷貝工作。

  在這個(gè)例子中,可以通過替換字符串連接為Response.Write()或者行內(nèi)腳本(< % =fld.Value % >)的方法提高程序性能。如果response buffering打開(也應(yīng)該打開),這將很快,因?yàn)镽esponse.Write僅僅附加數(shù)據(jù)在緩沖區(qū)的尾部,而且不需要再分配。

  如果用JScript連接字符串,強(qiáng)烈建議使用“+=”操作符,就是說,使用s+=“字符串”,而不是s = s+“字符串”。

技巧15:打開瀏覽器和代理的緩沖

  默認(rèn)情況下,ASP禁止了瀏覽器和代理的緩沖功能。如果有一個(gè)每次都不要更新的頁面,就應(yīng)該打開瀏覽器和代理的緩沖,這將允許瀏覽器和代理在一段時(shí)間內(nèi)使用該頁面的“緩沖”拷貝數(shù)據(jù)。緩沖能夠大大地減輕服務(wù)器的數(shù)據(jù)轉(zhuǎn)載量,并提高用戶的瀏覽性能。

哪些類別的動(dòng)態(tài)頁面適合被緩存呢?下面是一些例子:



  • 天氣頁面,每5分鐘更新一次
  • 新聞或版本列表頁面,每天更新2次

  注意:使用瀏覽器或者代理緩存后,對(duì)Web服務(wù)器的點(diǎn)擊次數(shù)就會(huì)減少。如果想精確地了解所有頁面,或者對(duì)于郵遞廣告,就不適于使用瀏覽器和代理緩存了。

  瀏覽器緩存由HTTP“Expires”頭參數(shù)控制,它由Web服務(wù)器發(fā)送給瀏覽器。ASP提供了2個(gè)簡單的方法發(fā)送這個(gè)頭部參數(shù)。設(shè)置頁面在未來一定時(shí)間內(nèi)到期,可以使用Response.Expires屬性。下面的例子將告訴瀏覽器內(nèi)容在10分鐘后過期:

< % Response.Expires = 10 % >

  設(shè)置Response.Expires為負(fù)數(shù)或者0,就禁止了緩存。對(duì)第2個(gè)屬性Response.ExpiresAbsolute的設(shè)置,允許指定在一個(gè)特殊時(shí)間到來時(shí)內(nèi)容過期。

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

  除了使用Response對(duì)象來設(shè)置到期時(shí)間,還可以在HTML文件頭部寫< META >標(biāo)記。盡管代理不會(huì)注意到這個(gè)標(biāo)記,但是一些瀏覽器可以。

< META HTTP-EQUIV="Expires" VALUE="May 31,2001 13:30:15" >

  最后,對(duì)于HTTP代理,使用Response.CacheControl可以指示是否緩存內(nèi)容。設(shè)置屬性為“Public”,打開代理緩存內(nèi)容的功能。

< % Response.CacheControl = "Public" % >

  默認(rèn)情況下,這個(gè)屬性是設(shè)置成“Private”的。注意:不要讓代理緩沖那些顯示給特定用戶的頁面,因?yàn)榇砜赡軙?huì)將屬于其他用戶的頁面送給當(dāng)前用戶。


 


技巧16:在任何可能時(shí)使用Server.Transfer,而不要用Response.Redirect

  Response.Redirect告訴瀏覽器請(qǐng)求另一個(gè)不同的頁面,這常常用于引導(dǎo)用戶到登錄頁面或者出錯(cuò)處理頁面。由于重定向強(qiáng)迫了一個(gè)新頁面請(qǐng)求,結(jié)果是瀏覽器必須要與Web服務(wù)器循環(huán)2次,并且Web服務(wù)器必須處理一個(gè)額外的請(qǐng)求。IIS5.0引進(jìn)了一個(gè)新功能Server.Transfer,它執(zhí)行在同一服務(wù)器上的頁面?zhèn)鬏敚@將避免額外的瀏覽器-Web服務(wù)器的數(shù)據(jù)循環(huán),形成良好的系統(tǒng)性能,對(duì)于用戶也有較好的響應(yīng)時(shí)間。

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

  存取服務(wù)器變量導(dǎo)致Web站點(diǎn)建立一個(gè)特殊的請(qǐng)求并收集所有的服務(wù)器變量,而并不是你要求的那個(gè)變量。這類似于在文件夾中取回一個(gè)特殊的文件,要想取回一個(gè)文件,就得首先獲取所在文件夾的信息。

  不要存取非法的Request對(duì)象(比如Request("Data")),對(duì)于那些不在Request.Cookies、Request.Form、Request.QueryString或者Request.ClientCertificate中的項(xiàng)目,隱含就指向了Request.ServerVariables變量,而這些變量要比其他集合對(duì)象慢得多。

技巧18:調(diào)整Web服務(wù)器

  有幾個(gè)IIS調(diào)整參數(shù)可以提高站點(diǎn)性能。比如,對(duì)于IIS4.0,我們經(jīng)常發(fā)現(xiàn)提高ASP ProcessorThreadMax參數(shù)能夠產(chǎn)生重大的效果,特別是在那些要等待后臺(tái)資源比如數(shù)據(jù)庫或中間件產(chǎn)品的站點(diǎn)。在IIS5.0中,你可以發(fā)現(xiàn)調(diào)整ASP線程通道要比調(diào)整AspProcessorThreadMax效果更佳。

最佳的配置設(shè)定取決于應(yīng)用程序代碼、支持的硬件設(shè)備以及客戶端的工作量。發(fā)現(xiàn)最佳配置的唯一方法就是測(cè)試。


該文章在 2011/4/24 0:39:56 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved