国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > ASP > 正文

最優(yōu)化ASP程序性能

2019-11-18 22:19:17
字體:
供稿:網(wǎng)友
    Active Server Pages可以讓動(dòng)態(tài)頁面很快地執(zhí)行,但是,在代碼中和數(shù)據(jù)庫的連接上加入一些技巧,就能讓程序更
快地執(zhí)行。這是一篇關(guān)于如何精制腳本程序以及asp特征來達(dá)到最大速度的文章。任何在用戶點(diǎn)擊按鈕到在屏幕上出現(xiàn)結(jié)果
間延遲都會(huì)讓用戶茫然,對(duì)于一個(gè)商業(yè)站點(diǎn),這就意味著潛在的用戶損失。
ASP腳本的尺寸


   我們也許不能控制用戶的帶寬,但是通過優(yōu)化ASP站點(diǎn),我們的確能夠使應(yīng)用達(dá)到最佳性能。許多潛在的性能收獲可
以通過系統(tǒng)調(diào)整,而不是改變代碼。

   因素

   首先,有哪些因素可能影響ASP程序的性能?很不幸,有許多嗎?這里僅僅是一些:

有限的帶寬
服務(wù)器端的處理器和其他硬件的速度
在服務(wù)器上運(yùn)行的其他進(jìn)程(比如那些OpenGL屏幕保護(hù)程序中的一個(gè))
數(shù)據(jù)庫連接模式,連接池,或者單獨(dú)的數(shù)據(jù)庫(比如Oracle、SQLServer、access
使用的語言
存儲(chǔ)過程和SQL
使用未編譯組件,而不是VB或者JavsScript的ASP
良好的編程習(xí)慣,比如對(duì)錯(cuò)誤的處理
   對(duì)于一個(gè)有經(jīng)驗(yàn)的具備良好IIS知識(shí)的開發(fā)者來說,以上一些特征是很平常的,但是另外一些可能非常復(fù)雜。在這篇
文章中,讓我們來研究一下如何做才能節(jié)省毫秒級(jí)別的時(shí)間,而不是試圖面面俱到。

   你的ASP腳本程序?qū)τ趯?shí)現(xiàn)的功能是否顯得過長?這就會(huì)從開始影響程序的性能。對(duì)于收集信息和格式化輸出,ASP腳
本是非常有用的,但是腳本是按照行來解釋執(zhí)行的,所以代碼越長,執(zhí)行時(shí)間越長。

   如果有一個(gè)很長的ASP腳本程序,怎么樣才能減少長度呢?這里有一些建議。

   你可以將它們轉(zhuǎn)換為服務(wù)器端組件,換言之,就是創(chuàng)建一個(gè)Visual Basic DLL文件,或者使用任何現(xiàn)代的Windows 程
序語言和COM兼容語言來建立一個(gè)未編譯組件,并且在服務(wù)器上注冊(cè)。關(guān)于這個(gè)功能的教程請(qǐng)參閱
http://www.webdevelopersjournal.com/articles/activex_for_asp.html。一個(gè)編寫很好的ActiveX組件不僅能大幅度提
高速度,而且,它還能大大地提高你的軟件的保護(hù)程度,特別是你為第3方開發(fā)ASP程序時(shí)。

   因?yàn)槟_本是一行行解釋執(zhí)行的,所以排除多余的腳本或者建立有效率的腳本,就能提高程序性能。如果在一個(gè)單一頁
面中有成百行的ASP腳本,你就可能很好地將程序分割成用戶、商業(yè)和數(shù)據(jù)服務(wù)部分。實(shí)際上,如果這么做了,你就會(huì)發(fā)現(xiàn)
一些多余的代碼。比如,如果需要顯示幾個(gè)表格,就可以編寫一個(gè)通用的表格顯示函數(shù),這樣,在需要的地方調(diào)用就可以
了。

   與尺寸相關(guān)的另外一個(gè)問題就是包含文件的長度。當(dāng)執(zhí)行一個(gè)#include文件時(shí),整個(gè)文件都被調(diào)入,就象在被包含的
文件中存在一樣。所以,如果有一個(gè)甬余的包含文件,其中包含了許多全局方法和變量定義,那么就請(qǐng)注意它們將被調(diào)入
每一個(gè)包含它們的文件中,而不管是否可用。ASP緩存了所有的擴(kuò)展代碼,導(dǎo)致了效率低下的搜索。在這種情況下,包含文
件必須變小。盡管包含文件被服務(wù)器處理為單獨(dú)的請(qǐng)求,但是過多的使用#include,就會(huì)導(dǎo)致下載時(shí)間的過度增加。

< !-- #include file="Header.asp" --  >
< !-- #include file="Footer.asp" -- >
< SCRIPT language="vbscript" runat="server" >

Sub Main()
  WriteHeader
  WriteBody
  WriteFooter
End Sub

Sub WriteBody()
  ...
End Sub

Main     'call sub Main
< /SCRIPT >

   如果腳本很長,注意要使用 Response.IsClientConnected 命令,這將避免因客戶端不再連接時(shí)CPU浪費(fèi)運(yùn)行循環(huán)。

< %
'check to see if the client is connected
If Not Response.IsClientConnected Then
  'still connected so PRoceed
Else
  'disconnected
End If
% >

分散ASP代碼和HTML語言命令
有人這么做嗎?當(dāng)描述表格時(shí),在ASP和HTML進(jìn)行切換,比如:

< HTML >
< BODY >
< %
  Set MyConn = Server.CreateObject("ADODB.Connection")
  MdbFilePath = Server.MapPath("sample.mdb")
  MyConn.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & MdbFilePath & ";"
  SQL_query = "SELECT * FROM Friends"
  Set RS = MyConn.Execute(SQL_query)
  WHILE NOT RS.EOF
% >
< LI >< %=RS("Name")% >: < A HREF="< %=RS("Link")% >" >Homepage< /A >
< %
  RS.MoveNext
  WEND
% >
< /BODY >
< /HTML >

   另外一個(gè)例子是使用If命令:

< %
  If Not session("DBOpen") Then
% >
< H1 >Database not connected< /H1 >
< %
  Else
% >
< H1 >Database open< /H1 >
< %
  End If
% >

   在以上2個(gè)例子中,腳本性能能通過保持ASP程序塊在服務(wù)器端以及使用Response.Write來產(chǎn)生HTML代碼來提高性能,
就象下面一樣:

< %
If not Session ("DBOpen") Then
   Response.Write "< H1 >Database not connected< /H1 >"
Else
   Response.Write "< H1 >Database open< /H1 >"
End If
% >

對(duì)于大且長的腳本,你可以通過上面的方法看到明顯的性能提高。
   會(huì)話狀態(tài)

   毋庸置疑,通過session在ASP中保持狀態(tài)是一個(gè)非常重要的特征。然而,這將影響程序的性能。很明顯,服務(wù)器的伸
縮性因?yàn)閟ession僅僅能局限于單一服務(wù)器而變成一個(gè)問題,一個(gè)session為每一個(gè)用戶都要消耗資源。

   如果不使用session變量,而且實(shí)際上也可能不需要,因?yàn)槭褂秒[藏表單域、在數(shù)據(jù)庫中存儲(chǔ)數(shù)值以及使用查詢字符
串可以完成session的功能,這時(shí),就應(yīng)該屏蔽session狀態(tài),代碼如下:

   @EnableSessionState = False

   這樣,ASP就將不再檢查session信息。

   如果確實(shí)要依靠session狀態(tài),那么請(qǐng)避免在session對(duì)象中存放大量的數(shù)據(jù)。如果設(shè)置了客戶端的HTTP Cookies,那
么IIS中的Session是生效的,并且直到session被中止或者到期,為每一個(gè)session分配的內(nèi)存空間將一直保留。由于這個(gè)
原因,當(dāng)有許多并發(fā)用戶訪問站點(diǎn)時(shí),資源將會(huì)很快耗盡。


數(shù)據(jù)庫訪問

   存取數(shù)據(jù)庫將會(huì)很快地減慢程序,但是沒有數(shù)據(jù)庫,許多站點(diǎn)也不行。不要使用內(nèi)植的SQL語句來存取數(shù)據(jù)庫,你可
以通過使用存儲(chǔ)過程來訪問數(shù)據(jù)庫,這將會(huì)贏得很大的程序性能,而且,也非常得靈活。使用存儲(chǔ)過程,并配合ActiveX
Data Objects(ADO),就能最大程度地控制存儲(chǔ)過程如何輸出。

   確認(rèn)數(shù)據(jù)庫經(jīng)過了索引,因?yàn)檫@將直接影響到應(yīng)用程序的整體性能。同時(shí),注意在數(shù)據(jù)庫上運(yùn)行更新統(tǒng)計(jì)程序,從而
更好地跟蹤數(shù)據(jù)的分布。注意,一些數(shù)據(jù)庫,比如MS Access,不適于企業(yè)級(jí)應(yīng)用,而SQL Server 7.0或者Oracle更適于做
這些。

   讓SQL做設(shè)計(jì)好的工作,包括對(duì)數(shù)據(jù)進(jìn)行計(jì)算、加入、排序和分組。不要用其他語言寫這些功能,可以編寫一個(gè)查詢
來完成。

   任何要計(jì)算的字段就是下面所示的簡單語法:

   SELECT count(*) FROM publishers WHERE state='NY'

   如果要計(jì)算一個(gè)特殊字段,必須先按那個(gè)字段分組,否則,將不會(huì)工作:

   SELECT count(city),city FROM publishers GROUP BY city

   接著確定排序方法:

   SELECT * FROM TableName WHERE FieldName >50 OR FieldName< 100 ORDER BY FieldName2, FieldName3

   仍然使用ODBC系統(tǒng)或者文件DSN來連接數(shù)據(jù)庫,或者使用很快的OLEDB技術(shù)來連接。使用后者,當(dāng)移動(dòng)Web文件時(shí),不
再需要修改配置。

   OLEDB位于應(yīng)用程序與ODBC層之間。在ASP頁面中,ADO就是位于OLEDB之上的程序。調(diào)用ADO時(shí),首先發(fā)送給OLEDB,然
后再發(fā)送給ODBC層。可以直接連接到OLEDB層,這么做后,將提高服務(wù)器端的性能。怎么直接連接到OLEDB呢?

   如果使用SQLServer 7,使用下面的代碼做為連接字符串:

strConnString = "DSN='';DRIVER={SQL SERVER};" & _
                "UID=myuid;PWD=mypwd;" & _
                "DATABASE=MyDb;SERVER=MyServer;"

   最重要的參數(shù)就是“DRIVER=”部分。如果你想繞過ODBC而使用OLEDB來訪問SQL Server,使用下面的語法:

strConnString ="Provider=SQLOLEDB.1;PassWord=mypassword;" & _
               "Persist Security Info=True;User ID=myuid;" & _
               "Initial Catalog=mydbname;" & _
               "Data Source=myserver;Connect Timeout=15"

   為什么這很重要

   現(xiàn)在你可能奇怪為什么學(xué)習(xí)這種新的連接方法很關(guān)鍵?為什么不使用標(biāo)準(zhǔn)的DSN或者系統(tǒng)DSN方法?好,根據(jù)Wrox在他
們的ADO 2.0程序員參考書籍中所做的測(cè)試,如果使用OLEDB連接,要比使用DSN或者DSN-less連接,有以下的性能提高表
現(xiàn):

   性能比較
SQL Access
  OLEDB DSN   OLEDB DSN
連接時(shí)間: 18 82 連接時(shí)間: 62 99
重復(fù)1,000個(gè)記錄的時(shí)間: 2900 5400 重復(fù)1,000個(gè)記錄的時(shí)間: 100 950

   這個(gè)結(jié)論在Wrox的ADO 2.0程序員參考發(fā)表。時(shí)間是以毫秒為單位,重復(fù)1,000個(gè)記錄的時(shí)間是以服務(wù)器油標(biāo)的方式
計(jì)算的。

   ● 只有可能,就使用客戶端腳本對(duì)用戶輸入進(jìn)行驗(yàn)證,以此來最小化HTTP請(qǐng)求的循環(huán)操作。

   如果瀏覽器具備執(zhí)行javaScript或其他腳本的能力,請(qǐng)充分應(yīng)用,從而解放服務(wù)器端的資源。

   下面的VBScript腳本在用戶的瀏覽器端運(yùn)行,檢查用戶信息,然后再提交給服務(wù)器:

< SCRIPT LANGUAGE="VBScript" >
< !--
Sub btnEnter_OnClick
  Dim TheForm
  Set TheForm = Document.MyForm
  If IsNumeric(TheForm.Age.Value) Then    
    TheForm.submit
  Else
    Msgbox "Please enter a numerical age."
  End if
End Sub
//-- >
< /SCRIPT >

< FORM  method="POST" name=MyForm  action="myfile.asp"   >  
   Name: < INPUT typr="text" name="Name"  >
   Age: < INPUT type="text" name="Age"  >
   < INPUT type="button" name="btnEnter"  value="Enter" >
< /FORM >

   ● 使用局部變量,而不要使用全局變量

   因?yàn)榫植孔兞靠梢院芸斓乇籄SP腳本引擎所存取,整個(gè)名字空間不必被搜索。避免重定義數(shù)組,在數(shù)組初始化時(shí)就分
配足夠的尺寸,會(huì)大大地提高效率。這么做可能浪費(fèi)一些內(nèi)存,但是確贏得了速度,尤其是在服務(wù)器有很大的負(fù)載時(shí)。

   ● 使用< OBJECT > 標(biāo)記創(chuàng)建對(duì)象

   如果需要引用一個(gè)實(shí)際上可能不被使用的對(duì)象,使用< OBJECT >標(biāo)記來例示它們,而不要用Server.CreateObject。
后者將導(dǎo)致對(duì)象立即被創(chuàng)建,而< OBJECT >是當(dāng)對(duì)象被首次引用時(shí)才被創(chuàng)建。

   比如,下面的代碼演示了使用< OBJECT >標(biāo)記來創(chuàng)建一個(gè)應(yīng)用程序范圍內(nèi)的AD Rotator對(duì)象實(shí)例:

< OBJECT runat=server scope=application id=MyAds progid="MSWC.AdRotator" >
< /OBJECT >
   然后,就可以在其他頁面引用它:

   ● 打開“Option Explicit”

   在VB和VBScript中,你可以不用明確地定義就使用變量。但是打開“明確定義變量”選項(xiàng),將有助于提高程序性能。
未定義的局部變量是很慢的,因?yàn)樵谧兞縿?chuàng)建前,整個(gè)的名字空間都要搜索,看看是否變量已經(jīng)存在。所以,請(qǐng)打開
“Option Explicit”,這是一個(gè)好的編程習(xí)慣。

   ● 慎用 Server.MapPath

   除非必須,不要使用Server.MapPath!相反,如果知道路徑,就使用明確的文字路徑來表示。使用MapPath,將要求
IIS去取回當(dāng)前服務(wù)器路徑,這意味著對(duì)IIS一個(gè)特殊的請(qǐng)求,從而降低了程序性能。另外的完成這個(gè)工作的方法是在局部
變量中保存路徑信息,當(dāng)需要使用它時(shí),服務(wù)器就不用再被過度請(qǐng)求。

   檢查怎樣做

   你可以通過下面的工具來測(cè)算服務(wù)器性能:Task Manager,NetMon 和 PerfMon。用WCAT (Web Capacity Analysis
Tool)測(cè)量服務(wù)器的容量。你可以使用WCAT來檢查Internet信息服務(wù)和網(wǎng)絡(luò)配置如何響應(yīng)不同的客戶端對(duì)內(nèi)容、數(shù)據(jù)和HTML
頁面的請(qǐng)求。測(cè)試的結(jié)果可以被用來決定如何最優(yōu)化服務(wù)器和網(wǎng)絡(luò)配置。

   通過最優(yōu)化ASP應(yīng)用程序性能,Web站點(diǎn)應(yīng)用將會(huì)變得很快,最終做到:當(dāng)不需要時(shí),就不需要去做影響性能的點(diǎn)擊。

   總結(jié)

   當(dāng)談到ASP性能時(shí),要涉及到許多方面,本文已經(jīng)討論了一些。但是,對(duì)于每個(gè)具體的應(yīng)用,應(yīng)該有單獨(dú)的考慮,并
不是這里討論的技巧都能很合適地滿足。




發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 平凉市| 桓仁| 老河口市| 合阳县| 天水市| 吉木萨尔县| 德令哈市| 西林县| 墨脱县| 京山县| 郴州市| 嘉义县| 房产| 武邑县| 大埔区| 夏河县| 大足县| 铁力市| 天全县| 定边县| 威海市| 柯坪县| 沛县| 石城县| 海丰县| 昌平区| 闸北区| 芜湖县| 桐乡市| 景德镇市| 贵州省| 澄迈县| 江北区| 屏南县| 灵璧县| 平南县| 平湖市| 汶上县| 灌云县| 遂昌县| 桦川县|