亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > ASP > 正文

asp 性能測(cè)試報(bào)告 學(xué)習(xí)asp朋友需要了解的東西

2024-05-04 11:08:38
字體:
供稿:網(wǎng)友
看了下面的文章,發(fā)現(xiàn)作者的測(cè)試真的對(duì)用asp的朋友很有幫助,不只是asp其它的語(yǔ)言應(yīng)該也類似。
 
 
 
服務(wù)器上生成動(dòng)態(tài)內(nèi)容是使用ASP最主要的原因之一,所以我們選擇的第一個(gè)測(cè)試項(xiàng)目是確定把動(dòng)態(tài)內(nèi)容發(fā)送到應(yīng)答流使用什么方法最好?;镜倪x擇有兩種(以及它們的一些變化):使用內(nèi)嵌ASP標(biāo)記,使用Response.Write語(yǔ)句。 

   為測(cè)試這些不同的方法,我們創(chuàng)建了一個(gè)簡(jiǎn)單的ASP頁(yè)面,頁(yè)面先定義一些變量然后把它們插入到表格。雖然這個(gè)頁(yè)面很簡(jiǎn)單,而且沒有實(shí)際用途,但它足以讓我們分離和測(cè)試各個(gè)問題。 

   2.1 使用ASP內(nèi)嵌標(biāo)記 

   第一個(gè)測(cè)試是使用ASP的內(nèi)嵌標(biāo)記<%= x %>,其中x是一個(gè)變量。這是使用最方便的方法,而且它可以讓頁(yè)面的HTML部分變得更容易閱讀和維護(hù)。 
復(fù)制代碼代碼如下:

<% OPTION EXPLICIT 
Dim FirstName 
Dim LastName 
Dim MiddleInitial 
Dim Address 
Dim City 
Dim State 
Dim PhoneNumber 
Dim FaxNumber 
Dim EMail 
Dim BirthDate 

FirstName = "John" 
MiddleInitial = "Q" 
LastName = "Public" 
Address = "100 Main Street" 
City = "New York" 
State = "NY" 
PhoneNumber = "1-212-555-1234" 
FaxNumber = "1-212-555-1234" 
EMail = "john@public.com" 
BirthDate = "1/1/1950" 
%> 

<HTML> 
<HEAD> 
<TITLE>Response Test</ TITLE> 
</HEAD> 
<BODY> 
<H1>Response Test</H1> 
<TABLE> 
<tr><td><b>First Name:</b></td><td><%= FirstName %></td></tr> 
<tr><td><b>Middle Initial:</b></td><td><%= MiddleInitial %></td></tr> 
<tr><td><b>Last Name:</b></td><td><%= LastName %></td></tr> 
<tr><td><b>Address:</b></td><td><%= Address %></td></tr> 
<tr><td><b>City:</b></td><td><%= City %></td></tr> 
<tr><td><b>State:</b></td><td><%= State %></td></tr> 
<tr><td><b>Phone Number:</b></td><td><%= PhoneNumber %></td></tr> 
<tr><td><b>Fax Number:</b></td><td><%= FaxNumber %></td></tr> 
<tr><td><b>EMail:</b></td><td><%= EMail %></td></tr> 
<tr><td><b>Birth Date:</b></td><td><%= BirthDate %></td></tr> 
</TABLE> 
</BODY> 
</HTML> 

/app1/response1.asp的完整代碼 

最好記錄 = 8.28 毫秒/頁(yè) 




   2.2 使用Response.Write輸出每一行HTML代碼 

   許多優(yōu)秀的文獻(xiàn)指出,應(yīng)當(dāng)避免使用前面的內(nèi)嵌標(biāo)記方法,因?yàn)樗鼘?dǎo)致一個(gè)稱為“上下文切換”的操作。這個(gè)操作發(fā)生在Web服務(wù)器所處理的代碼類型發(fā)生變化的時(shí)候(從純HTML的發(fā)送到腳本處理,或反過來),這種切換需要一定的時(shí)間。許多程序員在了解了這一點(diǎn)之后,他們的第一個(gè)反應(yīng)是將每一行HTML代碼都用Response.Write函數(shù)來輸出: 
復(fù)制代碼代碼如下:

... 
Response.Write("<html>") 
Response.Write("<head>") 
Response.Write(" <title>Response Test</title>") 
Response.Write("</head>") 
Response.Write("<body>") 
Response.Write("<h1>Response Test</h1>") 
Response.Write("<table>") 
Response.Write("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>") 
Response.Write("<tr><td><b>Middle Initial:</b></td><td>" & MiddleInitial & "</td></tr>") 
... 

/app1/response2.asp片斷 

最好記錄 = 8.28 毫秒/頁(yè) 
響應(yīng)時(shí)間 = 8.08 毫秒/頁(yè) 
差  額 = -0.20 毫秒 (減少 2.4%) 




   和內(nèi)嵌標(biāo)記版本相比,我們所看到的性能改善非常小,簡(jiǎn)直令人驚訝。這或許是因?yàn)轫?yè)面中多出了許多函數(shù)調(diào)用。不過這種方法還有一個(gè)更大的缺點(diǎn),由于HTML代碼嵌入到了函數(shù)內(nèi),腳本代碼變得非常冗長(zhǎng),閱讀和維護(hù)都不方便。 

   2.3 使用封裝函數(shù) 

   Response.Write并不會(huì)在文本行的末尾加上CRLF(Carriage Return - Line Feed,回車換行),這是使用上面這種方法最令人失望的地方。盡管已經(jīng)在服務(wù)器端把HTML代碼作了很好的格式化,但在瀏覽器中看到的仍舊只有長(zhǎng)長(zhǎng)的一行代碼。不過失望的不僅是這一個(gè)問題,人們很快就發(fā)現(xiàn)不存在能夠自動(dòng)添加CRLF的Response.WriteLn函數(shù)。一個(gè)很自然的反應(yīng)就是創(chuàng)建Response.Write的封裝函數(shù),在每行的后面加上CRLF: 
... 
writeCR("<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>") 
... 
SUB writeCR(str) 
Response.Write(str & vbCRLF) 
END SUB 
/app1/response4.asp片斷 

最好記錄 = 8.08 毫秒/頁(yè) 
響應(yīng)時(shí)間 = 10.11 毫秒/頁(yè) 
差  額 = +2.03 毫秒 (增加 25.1%) 




   結(jié)果是性能的大大下降。當(dāng)然,這主要是因?yàn)檫@種方法使得函數(shù)的調(diào)用次數(shù)加倍,它對(duì)性能的影響非常明顯。應(yīng)當(dāng)不惜代價(jià)地避免這種用法,CRLF導(dǎo)致每行的末尾多了兩個(gè)字節(jié),而這兩個(gè)字節(jié)對(duì)于瀏覽器顯示頁(yè)面是沒有用的。在大多數(shù)情況下,瀏覽器端HTML代碼的格式美觀只是方便了你的競(jìng)爭(zhēng)者閱讀和理解頁(yè)面的設(shè)計(jì)。 

   2.4 合并多個(gè)Response.Write 

   如果不考慮最后一次有關(guān)封裝函數(shù)的測(cè)試,下一個(gè)合理的步驟應(yīng)當(dāng)是將所有字符串從分開的Response.Write語(yǔ)句合并到一個(gè)語(yǔ)句,從而減少函數(shù)調(diào)用次數(shù)、提高代碼運(yùn)行效率。 
復(fù)制代碼代碼如下:

Response.Write("<html>" & _ 
"<head>" & _ 
"<title>Response Test</title>" & _ 
"</head>" & _ 
"<body>" & _ 
"<h1>Response Test</h1>" & _ 
"<table>" & _ 
"<tr><td><b>First Name:</b></td><td>" & FirstName & "</td></tr>" & _ 
... 
"<tr><td><b>Birth Date:</b></td><td>" & BirthDate & "</td></tr>" & _ 
"</table>" & _ 
"</body>" & _ 
"</html>") 

/app1/response3.asp片斷 

最好記錄 = 8.08 毫秒/頁(yè) 
響應(yīng)時(shí)間 = 7.05 毫秒/頁(yè) 
差  額 = -1.03 毫秒 (減少 12.7%) 




   這是目前為止最好的方法。 

   2.5 合并多個(gè)Response.Write,且在每一行的末尾增加CRLF 

   也有人非常關(guān)注他們的HTML代碼在瀏覽器端是否美觀,因此我們又在每一行HTML代碼的末尾加上了一個(gè)回車,使用的是vbCRLF常量,其他的測(cè)試代碼與上例一樣。 
... 
Response.Write("<html>" & vbCRLF & _ 
"<head>" & vbCRLF & _ 
" <title>Response Test</title>" & vbCRLF & _ 
"</head>" & vbCRLF & _ 
... 
/app1/response5.asp片斷 

最好記錄 = 7.05 毫秒/頁(yè) 
響應(yīng)時(shí)間 = 7.63 毫秒/頁(yè) 
差  額 = +0.58 毫秒 (增加 8.5%) 




   結(jié)果是性能略有下降,這可能是因?yàn)樵黾恿俗址B接操作,同時(shí)輸出的文本也增加了。 

   2.6 意見 

   根據(jù)上述ASP輸出測(cè)試的結(jié)果,我們得出如下編碼規(guī)則: 

避免過多地使用內(nèi)嵌ASP。 
把盡可能多的Response.Write語(yǔ)句合并成單個(gè)語(yǔ)句。 
絕對(duì)不要為了加上CRLF而封裝Response.Write。 
如果要格式化HTML輸出,直接在Response.Write語(yǔ)句后面加上CRLF。 

綱要:ASP動(dòng)態(tài)生成的內(nèi)容以什么方式輸出效率最高?最好用哪種方法提取數(shù)據(jù)庫(kù)記錄集?本文測(cè)試了近20個(gè)這類ASP開發(fā)中常見的問題,測(cè)試工具所顯示的時(shí)間告訴我們:這些通??梢韵氘?dāng)然的問題不僅值得關(guān)注,而且還有出乎意料的秘密隱藏在內(nèi)。 

一、測(cè)試目的 

   本文的第一部分考察了ASP開發(fā)中的一些基本問題,給出了一些性能測(cè)試結(jié)果以幫助讀者理解放入頁(yè)面的代碼到底對(duì)性能有什么影響。ADO是由Microsoft開發(fā)的一個(gè)通用、易用的數(shù)據(jù)庫(kù)接口,事實(shí)證明通過ADO與數(shù)據(jù)庫(kù)交互是ASP最重要的應(yīng)用之一,在第二部分中,我們就來研究這個(gè)問題。 

   ADO所提供的功能相當(dāng)廣泛,因此準(zhǔn)備本文最大的困難在于如何界定問題的范圍??紤]到提取大量的數(shù)據(jù)可能顯著地增加Web服務(wù)器的負(fù)載,所以我們決定這一部分的主要目的是找出什么才是操作ADO記錄集的最優(yōu)配置。然而,即使縮小了問題的范圍,我們?nèi)耘f面臨很大的困難,因?yàn)锳DO可以有許多種不同的方法來完成同一個(gè)任務(wù)。例如,記錄集不僅可以通過Recordset類提取,而且也可以通過Connection和Command類提?。患词沟玫接涗浖瘜?duì)象之后,還有許多可能戲劇性地影響性能的操作方法。然而,與第一部分一樣,我們將盡可能地涵蓋最廣泛的問題。 

   具體地講,這一部分的目標(biāo)是收集足夠多的信息,回答下列問題: 

l是否應(yīng)該通過包含引用ADOVBS.inc? 
l使用記錄集時(shí)是否應(yīng)該創(chuàng)建單獨(dú)的連接對(duì)象? 
l最好用哪種方法提取記錄集? 
l哪種游標(biāo)類型和記錄鎖定方式效率最高? 
l是否應(yīng)該使用本地記錄集? 
l設(shè)置記錄集屬性用哪種方法最好? 
l用哪種方法引用記錄集字段值效率最高? 
l用臨時(shí)字符串收集輸出是一種好方法嗎? 

二、測(cè)試環(huán)境 

   本測(cè)試總共用到了21個(gè)ASP文件,這些文件可以從本文后面下載。每一個(gè)頁(yè)面設(shè)置成可以運(yùn)行三種不同的查詢,分別返回0、25、250個(gè)記錄。這將幫助我們隔離頁(yè)面本身的初始化、運(yùn)行開銷與用循環(huán)訪問記錄集的開銷。 

   為便于測(cè)試,數(shù)據(jù)庫(kù)連接字符串和SQL命令串都在Global.asa中作為Application變量保存。由于我們的測(cè)試數(shù)據(jù)庫(kù)是SQL Server 7.0,因此連接串指定OLEDB作為連接提供者,測(cè)試數(shù)據(jù)來自SQL Server的Northwind數(shù)據(jù)庫(kù)。SQL SELECT命令從NorthWind Orders表提取7個(gè)指定的字段。 
復(fù)制代碼代碼如下:

<SCRIPT LANGUAGE=VBScript RUNAT=Server> 
Sub Application_OnStart 
Application("Conn") = "Provider=SQLOLEDB; " & _ 
"Server=MyServer; " & _ 
"uid=sa; " & _ 
"pwd=;" & _ 
"DATABASE=northwind" 
Application("SQL") = "SELECTTOP 0OrderID, " & _ 
"CustomerID, " & _ 
"EmployeeID, " & _ 
"OrderDate, " & _ 
"RequiredDate, " & _ 
"ShippedDate, " & _ 
"Freight " & _ 
"FROM[Orders] " 
End Sub 
</SCRIPT> 

'alternate sql - 25 records 
Application("SQL") = "SELECTTOP 25OrderID, " & _ 
"CustomerID, " & _ 
"EmployeeID, " & _ 
"OrderDate, " & _ 
"RequiredDate, " & _ 
"ShippedDate, " & _ 
"Freight " & _ 
"FROM[Orders] " 

'alternate sql - 250 records 
Application("SQL") = "SELECTTOP 250 OrderID, " & _ 
"CustomerID, " & _ 
"EmployeeID, " & _ 
"OrderDate, " & _ 
"RequiredDate, " & _ 
"ShippedDate, " & _ 
"Freight " & _ 
"FROM[Orders] " 

   測(cè)試服務(wù)器配置如下:450 Mhz Pentium,512 MB RAM,NT Server 4.0 SP5,MDAC 2.1(數(shù)據(jù)訪問組件),以及5.0版本的Microsoft腳本引擎。SQL Server運(yùn)行在另外一臺(tái)具有類似配置的機(jī)器上。和第一部分一樣,我們?nèi)耘f使用Microsoft Web Application Stress Tool 記錄從第一個(gè)頁(yè)面請(qǐng)求到從服務(wù)器接收到最后一個(gè)字節(jié)的時(shí)間(TTLB,Time To Last Byte),時(shí)間以毫秒為單位。測(cè)試腳本調(diào)用每個(gè)頁(yè)面1300次以上,運(yùn)行時(shí)間約20小時(shí),以下顯示的時(shí)間是會(huì)話的平均TTLB。請(qǐng)記住,和第一部分一樣,我們只關(guān)心代碼的效率,而不是它的可伸縮性或服務(wù)器性能。 

   同時(shí)請(qǐng)注意我們啟用了服務(wù)器的緩沖。另外,為了讓所有的文件名字長(zhǎng)度相同,有的文件名字中嵌入了一個(gè)或多個(gè)下劃線。 
三、第一次測(cè)試 

   在第一次測(cè)試中,我們模擬Microsoft ASP ADO示例中可找到的典型情形提取一個(gè)記錄集。在這個(gè)例子(ADO__01.asp)中,我們首先打開一個(gè)連接,然后創(chuàng)建記錄集對(duì)象。當(dāng)然,這里的腳本按照本文第一部分所總結(jié)的編碼規(guī)則作了優(yōu)化。 
復(fù)制代碼代碼如下:

<% Option Explicit %> 
<!-- #Include file="ADOVBS.INC" --> 
<% 
Dim objConn 
Dim objRS 

Response.Write( _ 
"<HTML><HEAD>" & _ 
"<TITLE>ADO Test</TITLE>" & _ 
"</HEAD><BODY>" _ 


Set objConn = Server.CreateObject("ADODB.Connection") 
objConn.Open Application("Conn") 

Set objRS = Server.CreateObject("ADODB.Recordset") 
objRS.ActiveConnection = objConn 
objRS.CursorType = adOpenForwardOnly 
objRS.LockType = adLockReadOnly 
objRS.Open Application("SQL") 

If objRS.EOF Then 
Response.Write("No Records Found") 
Else 
'write headings 
Response.Write( _ 
"<TABLE BORDER=1>" & _ 
"<TR>" & _ 
"<TH>OrderID</TH>" & _ 
"<TH>CustomerID</TH>" & _ 
"<TH>EmployeeID</TH>" & _ 
"<TH>OrderDate</TH>" & _ 
"<TH>RequiredDate</TH>" & _ 
"<TH>ShippedDate</TH>" & _ 
"<TH>Freight</TH>" & _ 
"</TR>" _ 

'write data 
Do While Not objRS.EOF 
Response.Write( _ 
"<TR>" & _ 
"<TD>" & objRS("OrderID") & "</TD>" & _ 
"<TD>" & objRS("CustomerID") & "</TD>" & _ 
"<TD>" & objRS("EmployeeID") & "</TD>" & _ 
"<TD>" & objRS("OrderDate") & "</TD>" & _ 
"<TD>" & objRS("RequiredDate") & "</TD>" & _ 
"<TD>" & objRS("ShippedDate") & "</TD>" & _ 
"<TD>" & objRS("Freight") & "</TD>" & _ 
"</TR> " _ 

objRS.MoveNext 
Loop 
Response.Write("</TABLE>") 
End If 

objRS.Close 
objConn.Close 
Set objRS = Nothing 
Set objConn = Nothing 

Response.Write("</BODY></HTML>") 
%> 

   下面是測(cè)試結(jié)果: 

   我們來看一下各欄數(shù)字的含義: 
0返回0個(gè)記錄的頁(yè)面所需要的TTLB(毫秒)。在所有的測(cè)試中,該值被視為生成頁(yè)面本身(包括創(chuàng)建對(duì)象)的時(shí)間開銷,不包含循環(huán)訪問記錄集數(shù)據(jù)的時(shí)間。 
25以毫秒計(jì)的提取和顯示25個(gè)記錄的TTLB 
tot time/25"25"欄的TTLB除以25,它是每個(gè)記錄的總計(jì)平均時(shí)間開銷。 
disp time/25"25"欄的TTLB減去"0"欄的TTLB,然后除以25。該值反映了在循環(huán)記錄集時(shí)顯示單個(gè)記錄所需時(shí)間。 
250提取和顯示250個(gè)記錄的TTLB。 
tot time/250"250"欄的TTLB除以25,該值代表單個(gè)記錄的總計(jì)平均時(shí)間開銷。 
disp time/250"250"欄的TTLB減去"0"欄的TTLB,再除以250。該值反映了在循環(huán)記錄集時(shí)顯示單個(gè)記錄所需時(shí)間。 

   上面的測(cè)試結(jié)果將用來同下一個(gè)測(cè)試結(jié)果比較。 
四、是否應(yīng)該通過包含引用ADOVBS.inc? 

   Microsoft提供的ADOVBS.inc包含了270行代碼,這些代碼定義了大多數(shù)的ADO屬性常量。我們這個(gè)示例只從ADOVBS.inc引用了2個(gè)常量。因此本次測(cè)試(ADO__02.asp)中我們刪除了包含文件引用,設(shè)置屬性時(shí)直接使用相應(yīng)的數(shù)值。 

objRS.CursorType = 0?' adOpenForwardOnly 
objRS.LockType = 1' adLockReadOnly 


   可以看到頁(yè)面開銷下降了23%。該值并不影響單個(gè)記錄的提取和顯示時(shí)間,因?yàn)檫@里的變化不會(huì)影響循環(huán)內(nèi)的記錄集操作。有多種方法可以解決ADOVBS.inc的引用問題。我們建議將ADOVBS.inc文件作為參考,設(shè)置時(shí)通過注釋加以說明。請(qǐng)記住,正如第一部分所指出的,適度地運(yùn)用注釋對(duì)代碼的效率影響極小。另外一種方法是將那些需要用到的常量從ADOVBS.inc文件拷貝到頁(yè)面內(nèi)。 

   還有一個(gè)解決該問題的好方法,這就是通過鏈接ADO類型庫(kù)使得所有的ADO常量直接可用。把下面的代碼加入Global.asa文件,即可直接訪問所有的ADO常量: 

<!--METADATA TYPE="typelib" 
FILE="C:Program FilesCommon FilesSYSTEMADOmsado15.dll" 
NAME="ADODB Type Library" --> 

或者: 

<!--METADATA TYPE="typelib" 
UUID="00000205-0000-0010-8000-00AA006D2EA4" 
NAME="ADODB Type Library" --> 

   因此,我們的第一條規(guī)則為: 

l避免包含ADOVBS.inc文件,通過其他方法訪問和使用ADO常量。 
五、使用記錄集時(shí)是否應(yīng)該創(chuàng)建單獨(dú)的連接對(duì)象? 

   要正確地回答這個(gè)問題,我們必須分析兩種不同條件下的測(cè)試:第一,頁(yè)面只有一個(gè)數(shù)據(jù)庫(kù)事務(wù);第二,頁(yè)面有多個(gè)數(shù)據(jù)庫(kù)事務(wù)。 

   在前例中,我們創(chuàng)建了一個(gè)單獨(dú)的Connection對(duì)象并將它賦給Recordset的ActiveConnection屬性。然而,如ADO__03.asp所示,我們也可以直接把連接串賦給ActiveConnection屬性,在腳本中初始化和配置Connection對(duì)象這一額外的步驟可以省去。 

objRS.ActiveConnection = Application("Conn") 

   雖然Recordset對(duì)象仍舊要?jiǎng)?chuàng)建一個(gè)連接,但此時(shí)的創(chuàng)建是在高度優(yōu)化的條件下進(jìn)行的。因此,與上一次測(cè)試相比,頁(yè)面開銷又下降了23%,而且如預(yù)期的一樣,單個(gè)記錄的顯示時(shí)間沒有實(shí)質(zhì)的變化。

   因此,我們的第二個(gè)規(guī)則如下: 

l如果只使用一個(gè)記錄集,直接把連接串賦給ActiveConnection屬性。 

   接下來我們檢查頁(yè)面用到多個(gè)記錄集時(shí),上述規(guī)則是否仍舊有效。為測(cè)試這種情形,我們引入一個(gè)FOR循環(huán)將前例重復(fù)10次。在這個(gè)測(cè)試中,我們將研究三種變化: 

   第一,如ADO__04.asp所示,在每一個(gè)循環(huán)中建立和拆除Connection對(duì)象: 
復(fù)制代碼代碼如下:

Dim i 
For i = 1 to 10 

Set objConn = Server.CreateObject("ADODB.Connection") 
objConn.Open Application("Conn") 

Set objRS = Server.CreateObject("ADODB.Recordset") 
objRS.ActiveConnection = objConn 
objRS.CursorType = 0 'adOpenForwardOnly 
objRS.LockType = 1 'adLockReadOnly 
objRS.Open Application("SQL") 
If objRS.EOF Then 
Response.Write("No Records Found") 
Else 
'write headings 
... 
'write data 
... 
End If 

objRS.Close 
Set objRS = Nothing 
objConn.Close 
Set objConn = Nothing 

Next 

   第二,如ADO__05.asp所示,在循環(huán)外面創(chuàng)建Connection對(duì)象,所有記錄集共享該對(duì)象: 
復(fù)制代碼代碼如下:

Set objConn = Server.CreateObject("ADODB.Connection") 
objConn.Open Application("Conn") 

Dim i 
For i = 1 to 10 
Set objRS = Server.CreateObject("ADODB.Recordset") 
objRS.ActiveConnection = objConn 
objRS.CursorType = 0 'adOpenForwardOnly 
objRS.LockType = 1 'adLockReadOnly 
objRS.Open Application("SQL") 

If objRS.EOF Then 
Response.Write("No Records Found") 
Else 
'write headings 
... 
'write data 
... 
End If 

objRS.Close 
Set objRS = Nothing 

Next 
objConn.Close 
Set objConn = Nothing 

   第三,如ADO__06.asp所示,在每一個(gè)循環(huán)內(nèi)把連接串賦給ActiveConnection屬性: 
復(fù)制代碼代碼如下:

Dim i 
For i = 1 to 10 

Set objRS = Server.CreateObject("ADODB.Recordset") 
objRS.ActiveConnection = Application("Conn") 
objRS.CursorType = 0 'adOpenForwardOnly 
objRS.LockType = 1 'adLockReadOnly 
objRS.Open Application("SQL") 

If objRS.EOF Then 
Response.Write("No Records Found") 
Else 
'write headings 
... 
'write data 
... 
End If 

objRS.Close 
Set objRS = Nothing 
Next 


   就象我們可以猜想到的一樣,在循環(huán)內(nèi)創(chuàng)建和拆除連接對(duì)象是效率最差的方法。不過,令人驚異的是,在循環(huán)內(nèi)直接把連接串賦給ActiveConnection屬性只比共享單個(gè)連接對(duì)象稍微慢了一點(diǎn)。 

   盡管如此,第三規(guī)則應(yīng)該為: 

l同一頁(yè)面內(nèi)用到多個(gè)記錄集時(shí),創(chuàng)建單一的連接對(duì)象并通過ActiveConnection屬性共享它。 
六、哪種游標(biāo)類型和記錄鎖定方式效率最高? 

   迄今為止的所有測(cè)試中我們只使用了“只能向前”的游標(biāo)來訪問記錄集。ADO為記錄集提供的游標(biāo)還有三種類型:靜態(tài)可滾動(dòng)的游標(biāo),動(dòng)態(tài)可滾動(dòng)的游標(biāo),鍵集游標(biāo)。每種游標(biāo)都提供不同的功能,比如訪問前一記錄和后一記錄、是否可以看到其他程序?qū)?shù)據(jù)的修改等。不過,具體討論每一種游標(biāo)類型的功用已經(jīng)超出了本文的范圍,下表是各種游標(biāo)類型的一個(gè)比較性的分析。 

   和“只能向前”類型的游標(biāo)相比,所有其它的游標(biāo)類型都需要額外的開銷,而且這些游標(biāo)在循環(huán)內(nèi)一般也要慢一些。因此,我們?cè)概c您共享如下告誡:永遠(yuǎn)不要這樣認(rèn)為——“唔,有時(shí)候我會(huì)用到動(dòng)態(tài)游標(biāo),那么我就一直使用這種游標(biāo)吧。” 

   同樣的看法也適用于記錄鎖定方式的選擇。前面的測(cè)試只用到了只讀的加鎖方式,但還存在其他三種方式:保守式、開放式、開放式批處理方式。和游標(biāo)類型一樣,這些鎖定方式為處理記錄集數(shù)據(jù)提供了不同的功能和控制能力。 

   我們得出如下規(guī)則: 

l使用適合于處理任務(wù)的最簡(jiǎn)單的游標(biāo)類型和記錄鎖定方式。 
七、最好用哪種方法提取記錄集? 

   到目前為止我們一直通過創(chuàng)建Recordset對(duì)象提取記錄集,但是ADO也提供了間接的記錄集提取方法。下面的測(cè)試比較ADO__03.asp和直接從Connection對(duì)象創(chuàng)建記錄集(CONN_01.asp)這兩種方法: 
復(fù)制代碼代碼如下:

Set objConn = Server.CreateObject("ADODB.Connection") 
objConn.Open Application("Conn") 

Set objRS = objConn.Execute(Application("SQL")) 

   可以看到頁(yè)面開銷略有增加,單個(gè)記錄的顯示時(shí)間沒有變化。 

   下面我們?cè)賮砜纯磸腃ommand對(duì)象直接創(chuàng)建記錄集對(duì)象(CMD__02.asp): 
復(fù)制代碼代碼如下:

Set objCmd = Server.CreateObject("ADODB.Command") 
objCmd.ActiveConnection = Application("Conn") 
objCmd.CommandText = Application("SQL") 

Set objRS = objCmd.Execute 

   同樣,頁(yè)面開銷也略有增加,而單個(gè)記錄的顯示時(shí)間沒有本質(zhì)的變化。后面這兩種方法在性能上的差異很小,但我們還有一個(gè)重要的問題需要考慮。 

   通過Recordset類創(chuàng)建記錄集時(shí),我們能夠以最大的靈活性控制記錄集的處理方式。既然后面兩種方法未能有壓倒性的性能表現(xiàn),我們主要還是考慮默認(rèn)返回的游標(biāo)類型和記錄鎖定方式,對(duì)于某些場(chǎng)合來說默認(rèn)值并不一定是最理想的。 

   因此,除非由于特殊的原因需要選擇后面兩種方法,否則我們建議考慮下面的規(guī)則: 

l通過ADODB.Recordset類實(shí)例化記錄集,以獲得最好的性能和靈活性。 

八、是否應(yīng)該使用本地記錄集? 

   ADO允許使用本地(客戶端)記錄集,此時(shí)查詢將提取記錄集內(nèi)的所有數(shù)據(jù),查詢完成后連接可以立即關(guān)閉,以后使用本地的游標(biāo)訪問數(shù)據(jù),這為釋放連接帶來了方便。使用本地記錄集對(duì)于訪問那些要求數(shù)據(jù)離線使用的遠(yuǎn)程數(shù)據(jù)服務(wù)非常重要,那么,對(duì)于普通的應(yīng)用它是否同樣有所幫助? 

   下面我們加入CursorLocation屬性,并在打開記錄集之后關(guān)閉了連接(CLIENT1.asp): 
復(fù)制代碼代碼如下:

Set objRS = Server.CreateObject("ADODB.Recordset") 
objRS.CursorLocation = 2' adUseClient 
objRS.ActiveConnection = Application("Conn") 
objRS.LockType = 1?' adLockReadOnly 
objRS.Open Application("SQL") 
objRS.ActiveConnection = Nothing 

   理論上,這種方法由于以下兩個(gè)原因會(huì)對(duì)效率有所好處:第一,它避免了在記錄之間移動(dòng)時(shí)重復(fù)地通過連接請(qǐng)求數(shù)據(jù);第二,由于能夠方便地釋放連接,它減輕了資源需求。然而,從上表看起來使用本地記錄集對(duì)提高效率顯然沒有什么幫助。這或許是因?yàn)槭褂帽镜赜涗浖瘯r(shí),不管程序設(shè)置的是什么,游標(biāo)總是變成靜態(tài)類型。 

   第6個(gè)規(guī)則如下: 

l除非確實(shí)要求記錄集本地化,否則應(yīng)避免使用。 
十、用哪種方法引用記錄集字段值效率最高? 

   10.1 測(cè)試 

   至此為止我們一直通過名字引用記錄集中的字段值。由于這種方法要求每次都必須尋找相應(yīng)的字段,它的效率并不高。為證明這一點(diǎn),下面這個(gè)測(cè)試中我們通過字段在集合中的索引引用它的值(ADO__08.asp): 
復(fù)制代碼代碼如下:

'write data 
Do While Not objRS.EOF 
Response.Write( _ 
"<TR>" & _ 
"<TD>" & objRS(0) & "</TD>" & _ 
"<TD>" & objRS(1) & "</TD>" & _ 
"<TD>" & objRS(2) & "</TD>" & _ 
"<TD>" & objRS(3) & "</TD>" & _ 
"<TD>" & objRS(4) & "</TD>" & _ 
"<TD>" & objRS(5) & "</TD>" & _ 
"<TD>" & objRS(6) & "</TD>" & _ 
"</TR> " _ 

objRS.MoveNext 
Loop 


   和預(yù)期的一樣,頁(yè)面開銷也有小小的變化(這或許是因?yàn)榇a略有減少)。然而,這種方法在顯示時(shí)間上的改善是相當(dāng)明顯的。 

   在下一個(gè)測(cè)試中,我們把所有的字段分別綁定到變量(ADO__09.asp): 
復(fù)制代碼代碼如下:

If objRS.EOF Then 
Response.Write("No Records Found") 
Else 
'write headings 
... 
Dim fld0 
Dim fld1 
Dim fld2 
Dim fld3 
Dim fld4 
Dim fld5 
Dim fld6 
Set fld0 = objRS(0) 
Set fld1 = objRS(1) 
Set fld2 = objRS(2) 
Set fld3 = objRS(3) 
Set fld4 = objRS(4) 
Set fld5 = objRS(5) 
Set fld6 = objRS(6) 
'write data 
Do While Not objRS.EOF 
Response.Write( _ 
"<TR>" & _ 
"<TD>" & fld0 & "</TD>" & _ 
"<TD>" & fld1 & "</TD>" & _ 
"<TD>" & fld2 & "</TD>" & _ 
"<TD>" & fld3 & "</TD>" & _ 
"<TD>" & fld4 & "</TD>" & _ 
"<TD>" & fld5 & "</TD>" & _ 
"<TD>" & fld6 & "</TD>" & _ 
"</TR>" _ 

objRS.MoveNext 
Loop 
Set fld0 = Nothing 
Set fld1 = Nothing 
Set fld2 = Nothing 
Set fld3 = Nothing 
Set fld4 = Nothing 
Set fld5 = Nothing 
Set fld6 = Nothing 
Response.Write("</TABLE>") 
End If 

   這是目前為止最好的記錄。請(qǐng)注意單個(gè)記錄的顯示時(shí)間已經(jīng)降低到0.45毫秒以下。 

   上述腳本都要求對(duì)結(jié)果記錄集的構(gòu)造有所了解。例如,我們?cè)诹袠?biāo)題中直接使用了字段名字,單獨(dú)地引用各個(gè)字段值。下面這個(gè)測(cè)試中,不僅字段數(shù)據(jù)通過遍歷字段集合得到,而且字段標(biāo)題也用同樣的方式得到,這是一種更為動(dòng)態(tài)的方案(ADO__10.asp)。 
復(fù)制代碼代碼如下:

If objRS.EOF Then 
Response.Write("No Records Found") 
Else 
'write headings Response.Write("<TABLE BORDER=1><TR>") 
For Each objFld in objRS.Fields 
Response.Write("<TH>" & objFld.name & "</TH>") 
Next 
Response.Write("</TR>") 
'write data 
Do While Not objRS.EOF 
Response.Write("<TR>") 
For Each objFld in objRS.Fields 
? Response.Write("<TD>" & objFld.value & "</TD>") 
Next 
Response.Write("</TR>") 
objRS.MoveNext 
Loop 
Response.Write("</TABLE>") 
End If 

   可以看到,代碼性能有所下降,但它仍舊要比ADO__07.asp要快。 

   下一個(gè)測(cè)試示例是前面兩個(gè)方法的折衷。我們將繼續(xù)保持動(dòng)態(tài)特征,同時(shí)通過在動(dòng)態(tài)分配的數(shù)組中保存字段引用提高性能: 
復(fù)制代碼代碼如下:

If objRS.EOF Then 
Response.Write("No Records Found") 
Else 
Dim fldCount 
fldCount = objRS.Fields.Count 
Dim fld() 
ReDim fld(fldCount) 
Dim i 
For i = 0 to fldCount-1 
Set fld(i) = objRS(i) 
Next 

'write headings 
Response.Write("<TABLE BORDER=1><TR>") For i = 0 to fldCount-1 
Response.Write("<TH>" & fld(i).name & "</TH>") 
Next 
Response.Write("</TR>") 
'write data 
Do While Not objRS.EOF 
Response.Write("<TR>") 
For i = 0 to fldCount-1 
Response.Write("<TD>" & fld(i) & "</TD>") 
Next 
Response.Write("</TR>") 
objRS.MoveNext 
Loop 
For i = 0 to fldCount-1 
Set fld(i) = Nothing 
Next 
Response.Write("</TABLE>") 
End If 


   雖然還不能超過以前最好的成績(jī),但它比開頭的幾個(gè)示例要快,同時(shí)它具有動(dòng)態(tài)地處理任何記錄集這一優(yōu)點(diǎn)。 

   與前面的測(cè)試代碼相比,下面的測(cè)試代碼有了根本性的改動(dòng)。它使用記錄集對(duì)象的GetRows方法填充數(shù)組以供循環(huán)訪問數(shù)據(jù),而不是直接訪問記錄集本身。注意在調(diào)用GetRows之后立即把Recordset設(shè)置成了Nothing,也就是盡快地釋放了系統(tǒng)資源。另外,請(qǐng)注意數(shù)組的第一維代表字段,第二維代表行(ADO__12.asp)。 
復(fù)制代碼代碼如下:

If objRS.EOF Then 
Response.Write("No Records Found") 
objRS.Close 
Set objRS = Nothing 
Else 
'write headings 
... 

'set array 
Dim arrRS 
arrRS = objRS.GetRows 
'close recordset early 
objRS.Close 
Set objRS = Nothing 

'write data 
Dim numRows 
Dim numFlds 
Dim row 
Dim fld 
numFlds = Ubound(arrRS, 1) 
numRows = Ubound(arrRS, 2) 
For row= 0 to numRows 
Response.Write("<TR>") 
For fld = 0 to numFlds 
Response.Write("<TD>" & arrRS(fld, row) & "</TD>") 
Next 
Response.Write("</TR>") 
Next 

Response.Write("</TABLE>") 
End If 

   使用GetRows方法時(shí),整個(gè)記錄集都被提取到了數(shù)組。雖然記錄集極端龐大時(shí)可能產(chǎn)生資源問題,但是用循環(huán)訪問數(shù)據(jù)的速度確實(shí)更快了,這是由于取消了MoveNext和檢查EOF之類的函數(shù)調(diào)用。 

   速度是要付出代價(jià)的,現(xiàn)在記錄集的元數(shù)據(jù)已經(jīng)丟失了。為解決這個(gè)問題,我們可以在調(diào)用GetRows之前從記錄集對(duì)象提取標(biāo)題信息;此外,數(shù)據(jù)類型和其他信息也可以預(yù)先提取。另外還要注意的是,測(cè)試中性能上的優(yōu)勢(shì)只有在記錄集較大的時(shí)候才會(huì)出現(xiàn)。 

   這一組的最后一個(gè)測(cè)試中,我們使用了記錄集的GetString方法。GetString方法將整個(gè)記錄集提取成為一個(gè)大的字符串,并允許指定分隔符(ADO__13.asp): 
復(fù)制代碼代碼如下:

If objRS.EOF Then 
Response.Write("No Records Found") 
objRS.Close 
Set objRS = Nothing 
Else 
'write headings 
... 
'set array 
Dim strTable 
strTable = objRS.GetString (2, , "</TD><TD>", "</TD></TR><TR><TD>") 
'close recordset early 
objRS.Close 
Set objRS = Nothing 
Response.Write(strTable & "</TD></TR></TABLE>") 
End If 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美三级日韩在线| 日韩美女免费视频| 久久久免费人体| 日韩在线观看免费av| 国产精品理人伦一区二区三区| 人妻 日韩 欧美 综合 制服| 免费一区二区三区在线视频| 中文产幕区在线观看| 欧美 日韩 人妻 高清 中文| 美女精品网站| 国产成人综合在线视频| 动漫精品一区一码二码三码四码| 大地资源二中文在线影视观看| 免费网站看v片在线a| 91精品视频观看| 欧美福利一区| 欧美日韩中文国产| 国产喷水在线观看| 欧美日韩在线视频一区二区| 欧美韩日国产| av官网在线| av在线不卡免费看| 亚洲一区中文字幕在线| 人人澡人人添人人爽一区二区| 国产精品影音先锋| 亚洲国产一区二区三区青草影视| 国产精品久久久久永久免费看| 久久久久久这里只有精品| 亚洲区小说区图片区qvod| 国产aⅴ爽av久久久久成人| 成在在线免费视频| 国产精品亚洲一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 亚洲一区二区三区免费观看| 高清日韩电视剧大全免费| 欧美成人女星排名| 亚洲一区二区在线播放相泽| 在线视频1区| 91精品国产自产在线观看永久| 日本一区二区不卡| 网站免费在线观看| 欧美一区二区三区在线观看免费| 国产二区视频在线播放| 精品视频在线免费观看| 97久久精品| 91免费视频网站在线观看| 2019最新中文字幕| 久久精品资源| 无码精品国产一区二区三区免费| 日韩欧美在线一区| 国产v亚洲v天堂无码| 5278欧美一区二区三区| 91欧美日韩麻豆精品| 国产免费视频传媒| 欧美三级在线看| 亚洲成人免费在线| 久久久久久国产精品三级玉女聊斋| 久久精品亚洲天堂| 唐朝av高清盛宴| 亚洲欧美卡通另类91av| 国产精品国产亚洲精品看不卡15| 高潮在线视频| 蜜臀久久99精品久久久酒店新书| 久久婷婷人人澡人人喊人人爽| 黄动漫网站在线观看| 国产精品亚洲精品| 精品中文字幕一区二区三区| 亚洲精品午夜久久久久久久| 欧美丝袜丝交足nylons图片| 午夜精品视频在线| 日韩欧美国产网站| 国产精品毛片高清在线完整版| 成人h动漫精品一区| 欧美一区二区公司| 99re免费视频精品全部| 国产二区在线播放| 粉嫩aⅴ一区二区三区四区五区| 99999色| 日韩二区三区四区| 国产欧美一区二区精品久久久| 国产精品伊人色| 免费精品国产自产拍在| 极品销魂一区二区三区| 欧美小视频在线观看| 国产精国产精品| 伊人亚洲精品| 久久99国产精品99久久| 国产精品久久久久久久免费| 精品国自产拍在线观看| a视频在线观看免费| 欧美一区二区三区激情| 91麻豆精品国产91久久久资源速度| 日韩在线第一区| japanese色国产在线看视频| 日韩在线视屏| 亚洲熟女少妇一区二区| 午夜久久资源| 亚洲精品3区| 中文字幕视频一区二区在线有码| 亚洲一区二区成人| 99精品视频免费版的特色功能| wwwav网站| 精品一区精品二区高清| 亚洲成人综合在线| 亚洲精品在线观看www| 免费观看黄色av| 色18美女社区| 欧美日韩和欧美的一区二区| 韩日精品在线| 少妇在线看www| 狠狠躁少妇一区二区三区| 日韩成人精品视频在线观看| 在线观看av网站| 哺乳挤奶一区二区三区免费看| 国产精品伦一区二区三级视频| 在线观看视频亚洲| 亚洲欧美偷拍自拍| 亚洲一区二区三区在线观看网站| 好吊色一区二区| 日日摸夜夜添夜夜添精品视频| 日本福利在线观看| 爱爱视频网站| 最新av在线免费观看| 亚洲精品中文字| 国产人妖一区二区三区| 日本黄色免费视频| 欧美婷婷精品激情| 国产精品成人一区二区三区| 欧美激情aⅴ一区二区三区| 无码人妻精品一区二区| 国产精品 欧美激情| 精品999在线| 亚洲另类春色校园小说| 久草手机在线视频| 五月天综合激情| www.豆豆成人网.com| 九九热在线播放| av免费在线免费观看| 国产精品一区二区a| 日韩久久午夜影院| 经典三级在线一区| 人人超在线公开视频| 日本一区精品| 国产精品女同互慰在线看| 日本不卡免费新一二三区| 欧美在线免费一级片| 国产一级一片免费播放| 成人动漫一区二区在线| 蜜臀av一区二区在线观看| 日韩一区二区视频| 神马久久久久久久久久久| 久久电影一区| 91视频国产资源| 浮力影院网站午夜| 国产91在线亚洲| 久久综合中文色婷婷| 松下纱荣子在线观看| 亚洲精品美女视频| 91大神网址| 日韩美女免费观看| 日本网站免费在线观看| 精品免费在线观看| 青娱乐国产91| 色婷婷av一区二区三区大白胸| 宅男噜噜噜66一区二区| 伊人久久久久久久久久久| 国产色在线播放| 久久久久久99精品| 国产精品免费不| 91性高潮久久久久久久| 四虎影视精品永久在线观看| 国产在线视频不卡| 日本三级一区| 一区中文字幕| cao在线观看| 国产一级影片| 麻豆免费看一区二区三区| 操喷在线视频| 欧美极品少妇videossex| 99re这里只有精品在线| 欧美高跟鞋交xxxxhd| jizz亚洲女人高潮大叫| 先锋影音av资源网| 久久久久国产精品www| 亚洲va码欧洲m码| 亚洲国模精品私拍| freehdxxxx护士| 999久久久久久| 亚洲福利视频在线| 先锋影音在线播放av| 欧美成人精品三级在线观看| 韩国在线视频一区| 日韩欧美性视频| 最新av在线| 亚洲精品理论片| 亚洲大片免费观看| 亚洲色图综合久久| www.久久伊人| 亚洲欧洲国产专区| 精品一区二区免费在线观看| 欧美激情一区二区三区| 手机看片福利日韩| 日韩一区二区在线观看| 国产成人小视频| 国产精品美女久久久久久2018| 国产精品视频一区二区三区不卡| 一区二区三区视频在线观看| 露出调教综合另类| 亚洲第一天堂影院| 99精品国产热久久91蜜凸| 亚洲av成人精品毛片| 国内精品女同女同一区二区三区| 国产精品老熟女视频一区二区| 下面一进一出好爽视频| 久久久久久人妻一区二区三区| 精品无人国产偷自产在线| 青春草在线免费视频| 欧美久久久久久| brazzers精品成人一区| 无码国精品一区二区免费蜜桃| 狠狠色综合久久婷婷| 久久91精品视频| 国产三级自拍视频| 国产视频在线视频| 久久久精品久久久久特色影视| av色图一区| 无码精品国产一区二区三区免费| 欧美激情性爽国产精品17p| 国产午夜久久久久| 亚洲精品成人av久久| 国产精品视频yy9299一区| 国产一区二区三区精品视频| 性高潮久久久久久| 日韩欧美亚洲一区| 国产亲伦免费视频播放| 三级在线观看视频| 亚洲xxx在线观看| 国语自产精品视频在免费| 91porny九色| 欧美成人sm免费视频| 国模私拍一区二区| 国产成人av免费看| 欧美成人影院在线播放| 久久国产精品一区| 韩国欧美一区二区| 国产一级黄色| 亚洲AV无码成人精品区明星换面| 激情四房婷婷| 热99re久久精品这里都是免费| www.亚洲天堂| 欧美激情一区二区三区| 一个人免费播放在线视频看片| 精品欧美一区二区三区久久久| 天堂av中文在线| 国产精品资源在线看| 中文字幕第三区| 精品一二三四| 日韩欧美激情| 亚洲欧洲一二区| 日本精品在线观看| 欧美电影精品一区二区| 久久av资源| 三级网站在线免费观看| 日韩一区二区在线免费| 成人欧美一区二区三区黑人免费| 午夜av电影| 国精产品一区一区三区mba视频| 国产在线色视频| 国产97在线|亚洲| 99精品在线观看| 狠狠操第一页| 亚洲香蕉av| 欧美日韩国产一区在线| 亚洲综合图片| 美女日批在线观看| 一个色综合久久| 日韩xxx视频| 国产亚洲高清在线观看| 国产日韩欧美二区| 蜜桃臀一区二区三区| 99精品视频免费看| 国内精品视频免费| 亚洲日本中文字幕区| 热久久这里只有| 亚洲精品国产精品乱码视色| 欧美老肥婆性猛交视频| 69久久夜色精品国产69| 福利资源在线久| 人妻无码中文久久久久专区| 欧美大肥婆大肥bbbbb| 91成人在线免费观看| 欧美91在线| 2023国产精品自拍| 亚洲无线码一区二区三区| 在线看免费毛片| 欧美日韩福利在线| 国产午夜在线一区二区三区| 欧美视频日韩视频| 欧美色资源站| 国产亚洲一级| 国产精品777一区二区| 欧美成人sm免费视频| 欧美喷潮久久久xxxxx| 中文字幕欧美日韩一区| 夜级特黄日本大片_在线| 成人黄色小视频| 99久久精品无码一区二区毛片| 中文字幕不卡的av| 免费播放片a高清在线观看| 国产视频不卡一区| 日韩理论片在线观看| 在线免费色视频| 中文字幕一区二区在线播放| www.久久久精品| 人妻无码久久一区二区三区免费| 你懂的视频一区二区| 美美哒免费高清在线观看视频一区二区| 欧美日韩精品一区二区三区视频播放| 国产精品va在线| www久久日com| 亚洲欧美视频| 亚洲婷婷国产精品电影人久久| 美女又黄又免费的视频| 免费av中文字幕| 一区二区三区四区| 久久精品国产999大香线蕉| 久久精品网站免费观看| 在线观看你懂的视频|