當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]性能是一個(gè)很重要的特征。你需要事先設(shè)計(jì)好性能指標(biāo),否則日后就要為此重新編寫程序。就是說(shuō):要設(shè)想好怎樣最佳化地執(zhí)行ASP程序?  本文提出了一些優(yōu)化ASP應(yīng)用和VBScript的技巧,許多技巧和缺陷都經(jīng)

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

  本文提出了一些優(yōu)化ASP應(yīng)用和VBScript的技巧,許多技巧和缺陷都經(jīng)過(guò)了研討。這里列出的建議已經(jīng)在http://www.microsoft.com 和其他站點(diǎn)上進(jìn)行了測(cè)試,都工作得非常好。本文假設(shè)你具備ASP開(kāi)發(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ù)庫(kù)(Database),以及Internet信息服務(wù)器(IIS)的配置。除了這些,還有一些非常好的鏈接值得你一看。

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

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

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

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

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

$#@60;%
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
%$#@62;

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

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

?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?=?"$#@60;select?name=""EmploymentStatus"$#@62;"?&?vbCrLf
?Set?fldName?=?rs.Fields("StatusName")??ADO?Field?Binding
?Do?Until?rs.EOF
??Next?line?violates?Dont?Do?String?Concats,
??but?its?OK?because?we?are?building?a?cache
?s?=?s?&?"?$#@60;option$#@62;"?&?fldName?&?"$#@60;/option$#@62;"?&?vbCrLf
?rs.MoveNext
?Loop
?s?=?s?&?"$#@60;/select$#@62;"?&?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)用只有管理員才能訪問(wèn)的ASP頁(yè)面來(lái)更新數(shù)據(jù),或者,通過(guò)函數(shù)周期性的自動(dòng)更新數(shù)據(jù)。下面的例子中,與緩存數(shù)據(jù)一起保存了時(shí)鐘標(biāo)記,過(guò)一段時(shí)間后,就刷新數(shù)據(jù)。

$#@60;%
?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?$#@60;?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

有另外一個(gè)例子,請(qǐng)參閱 World’s Fastest ListBox with Application Data。

  必須意識(shí)到,在Session或者Application對(duì)象中緩存大容量的數(shù)組不是一個(gè)好的方法。存取數(shù)組中任何元素前,腳本語(yǔ)言的規(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頁(yè)面

  有時(shí)候,有“許多”數(shù)據(jù)要在內(nèi)存中緩存?!霸S多”是相對(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頁(yè)面的性能時(shí),從磁盤取回?cái)?shù)據(jù)不一定比從網(wǎng)絡(luò)數(shù)據(jù)庫(kù)中取回?cái)?shù)據(jù)快,但是緩存減少了網(wǎng)絡(luò)數(shù)據(jù)庫(kù)的調(diào)用。在大規(guī)模調(diào)用時(shí),這將明顯地提高網(wǎng)絡(luò)的吞吐能力。緩存一個(gè)費(fèi)時(shí)的查詢結(jié)果是非常有用的,比如對(duì)于一個(gè)復(fù)雜的存儲(chǔ)過(guò)程,或者大量的結(jié)果數(shù)據(jù)。

  ASP和COM提供了幾種建立基于磁盤緩沖配置的工具。ADO記錄集的Save()和 Open()函數(shù)負(fù)責(zé)保存和調(diào)入磁盤上的記錄集。另外還有一些組件:
Scripting.FileSystemObject 允許你創(chuàng)建、讀取和寫文件 MSXML,Microsoft XML 解析器隨Internet Explorer而來(lái),支持保存和裝入XML文檔 LookupTable對(duì)象(比如在MSN上使用)是從磁盤調(diào)入簡(jiǎn)單列表的很好選擇。   最后,考慮緩存磁盤數(shù)據(jù)的表達(dá)式,而不是數(shù)據(jù)本身。預(yù)處理的HTML可以存儲(chǔ)為.htm或者.asp文件,鏈接直接指向它們。使用諸如XBuilder或者M(jìn)icrosoft SQL Server Internet發(fā)布類的商業(yè)工具,能夠自動(dòng)處理這些過(guò)程。而且,也可以在.asp文件中包含HTML程序片斷。同樣,也可使用FileSystemObject從磁盤上讀取HTML文件,或者使用XML for early rendering來(lái)做這個(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)重的瓶頸問(wèn)題。

  特別地,當(dāng)組件編寫得不是很輕巧時(shí),就極可能產(chǎn)生瓶頸問(wè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組件和其他非輕型組件在頁(yè)范圍內(nèi)工作得很好,就是說(shuō),它們是在一個(gè)單一ASP頁(yè)面中創(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)人少些甚至沒(méi)有人。

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

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

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

  由于連接的記錄集存儲(chǔ)了數(shù)據(jù)庫(kù)連接的參考,所以,不要在Application或Session對(duì)象中緩存連接的記錄集。然而,可以安全地緩存disconnected類型的記錄集,它們并不保存相應(yīng)數(shù)據(jù)庫(kù)連接的參考。為了斷開(kāi)記錄集,執(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問(wèn)?ADO?and?SQL?Server。
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉