最佳化ASP程式效能

來源:互聯網
上載者:User
 Active Server Pages可以讓動態網頁面很快地執行,但是,在代碼中和資料庫的串連上加入一些技巧,就能讓程式更
快地執行。這是一篇關於如何精製指令碼程式以及ASP特徵來達到最大速度的文章。任何在使用者點擊按鈕到在螢幕上出現結果
間延遲都會讓使用者茫然,對於一個商業網站,這就意味著潛在的使用者損失。
ASP指令碼的尺寸


   我們也許不能控制使用者的頻寬,但是通過最佳化ASP網站,我們的確能夠使應用達到最佳效能。許多潛在的效能收穫可
以通過系統調整,而不是改變代碼。

   因素

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

有限的頻寬
伺服器端的處理器和其他硬體的速度
在伺服器上啟動並執行其他進程(比如那些OpenGL螢幕保護裝置程式中的一個)
資料庫連接模式,串連池,或者單獨的資料庫(比如Oracle、SQLServer、Access)
使用的語言
預存程序和SQL
使用未編譯組件,而不是VB或者JavsScript的ASP
良好的編程習慣,比如對錯誤的處理
   對於一個有經驗的具備良好IIS知識的開發人員來說,以上一些特徵是很平常的,但是另外一些可能非常複雜。在這篇
文章中,讓我們來研究一下如何做才能節省毫秒層級的時間,而不是試圖面面俱到。

   你的ASP指令碼程式對於實現的功能是否顯得過長?這就會從開始影響程式的效能。對於收集資訊和格式化輸出,ASP腳
本是非常有用的,但是指令碼是按照行來解釋執行的,所以代碼越長,執行時間越長。

   如果有一個很長的ASP指令碼程式,怎麼樣才能減少長度呢?這裡有一些建議。

   你可以將它們轉換為伺服器端組件,換言之,就是建立一個Visual Basic DLL檔案,或者使用任何現代的Windows 程
序語言和COM相容語言來建立一個未編譯組件,並且在伺服器上註冊。關於這個功能的教程請參閱
http://www.webdevelopersjournal.com/articles/activex_for_asp.html。一個編寫很好的ActiveX組件不僅能大幅度提
高速度,而且,它還能大大地提高你的軟體的保護程度,特別是你為第3方開發ASP程式時。

   因為指令碼是一行行解釋執行的,所以排除多餘的指令碼或者建立有效率的指令碼,就能提高程式效能。如果在一個單一頁
面中有成百行的ASP指令碼,你就可能很好地將程式分割成使用者、商業和資料服務部分。實際上,如果這麼做了,你就會發現
一些多餘的代碼。比如,如果需要顯示幾個表格,就可以編寫一個通用的表格顯示函數,這樣,在需要的地方調用就可以
了。

   與尺寸相關的另外一個問題就是包含檔案的長度。當執行一個#include檔案時,整個檔案都被調入,就象在被包含的
檔案中存在一樣。所以,如果有一個甬餘的包含檔案,其中包含了許多全域方法和變數定義,那麼就請注意它們將被調入
每一個包含它們的檔案中,而不管是否可用。ASP緩衝了所有的擴充代碼,導致了效率低下的搜尋。在這種情況下,包含文
件必須變小。儘管包含檔案被伺服器處理為單獨的請求,但是過多的使用#include,就會導致下載時間的過度增加。

< !-- #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 命令,這將避免因用戶端不再串連時CPU浪費運行迴圈。

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

分散ASP代碼和HTML語言命令
有人這麼做嗎?當描述表格時,在ASP和HTML進行切換,比如:

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

   另外一個例子是使用If命令:

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

   在以上2個例子中,指令碼效能能通過保持ASP程式塊在伺服器端以及使用Response.Write來產生HTML代碼來提高效能,
就象下面一樣:

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

對於大且長的指令碼,你可以通過上面的方法看到明顯的效能提高。
   工作階段狀態

   毋庸置疑,通過session在ASP中保持狀態是一個非常重要的特徵。然而,這將影響程式的效能。很明顯,伺服器的伸
縮性因為session僅僅能局限於單一伺服器而變成一個問題,一個session為每一個使用者都要消耗資源。

   如果不使用session變數,而且實際上也可能不需要,因為使用隱藏表單域、在資料庫中儲存數值以及使用查詢字元
串可以完成session的功能,這時,就應該屏蔽session狀態,代碼如下:

   @EnableSessionState = False

   這樣,ASP就將不再檢查session資訊。

   如果確實要依靠session狀態,那麼請避免在session對象中存放大量的資料。如果設定了用戶端的HTTP Cookies,那
麼IIS中的Session是生效的,並且直到session被中止或者到期,為每一個session分配的記憶體空間將一直保留。由於這個
原因,當有許多並發使用者訪問網站時,資源將會很快耗盡。


資料庫訪問

   存取資料庫將會很快地減慢程式,但是沒有資料庫,許多網站也不行。不要使用內植的SQL語句來存取資料庫,你可
以通過使用預存程序來訪問資料庫,這將會贏得很大的程式效能,而且,也非常得靈活。使用預存程序,並配合ActiveX
Data Objects(ADO),就能最大程度地控制預存程序如何輸出。

   確認資料庫經過了索引,因為這將直接影響到應用程式的整體效能。同時,注意在資料庫上運行更新統計程式,從而
更好地跟蹤資料的分布。注意,一些資料庫,比如MS Access,不適於企業級應用,而SQL Server 7.0或者Oracle更適於做
這些。

   讓SQL做設計好的工作,包括對資料進行計算、加入、排序和分組。不要用其他語言寫這些功能,可以編寫一個查詢
來完成。

   任何要計算的欄位就是下面所示的簡單文法:

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

   如果要計算一個特殊欄位,必須先按那個欄位分組,否則,將不會工作:

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

   接著確定排序方法:

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

   仍然使用ODBC系統或者檔案DSN來串連資料庫,或者使用很快的OLEDB技術來串連。使用後者,當移動Web檔案時,不
再需要修改配置。

   OLEDB位於應用程式與ODBC層之間。在ASP頁面中,ADO就是位於OLEDB之上的程式。調用ADO時,首先發送給OLEDB,然
後再發送給ODBC層。可以直接連接到OLEDB層,這麼做後,將提高伺服器端的效能。怎麼直接連接到OLEDB呢?

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

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

   最重要的參數就是“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"

   為什麼這很重要

   現在你可能奇怪為什麼學習這種新的串連方法很關鍵?為什麼不使用標準的DSN或者系統DSN方法?好,根據Wrox在他
們的ADO 2.0程式員參考書籍中所做的測試,如果使用OLEDB串連,要比使用DSN或者DSN-less串連,有以下的效能提高表
現:

   效能比較
SQL Access
  OLEDB DSN   OLEDB DSN
連線時間: 18 82 連線時間: 62 99
重複1,000個記錄的時間: 2900 5400 重複1,000個記錄的時間: 100 950

   這個結論在Wrox的ADO 2.0程式員參考發表。時間是以毫秒為單位,重複1,000個記錄的時間是以伺服器油標的方式
計算的。

   ● 只有可能,就使用用戶端指令碼對使用者輸入進行驗證,以此來最小化HTTP請求的迴圈操作。

   如果瀏覽器具備執行JavaScript或其他指令碼的能力,請充分應用,從而解放伺服器端的資源。

   下面的VBScript指令碼在使用者的瀏覽器端運行,檢查使用者資訊,然後再提交給伺服器:

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

   ● 使用局部變數,而不要使用全域變數

   因為局部變數可以很快地被ASP指令碼引擎所存取,整個名字空間不必被搜尋。避免重定義數組,在數組初始化時就分
配足夠的尺寸,會大大地提高效率。這麼做可能浪費一些記憶體,但是確贏得了速度,尤其是在伺服器有很大的負載時。

   ● 使用< OBJECT > 標記建立對象

   如果需要引用一個實際上可能不被使用的對象,使用< OBJECT >標記來例示它們,而不要用Server.CreateObject。
後者將導致對象立即被建立,而< OBJECT >是當對象被首次引用時才被建立。

   比如,下面的代碼示範了使用< OBJECT >標記來建立一個應用程式範圍內的AD Rotator對象執行個體:

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

   ● 開啟“Option Explicit”

   在VB和VBScript中,你可以不用明確地定義就使用變數。但是開啟“明確定義變數”選項,將有助於提高程式效能。
未定義的局部變數是很慢的,因為在變數建立前,整個的名字空間都要搜尋,看看是否變數已經存在。所以,請開啟
“Option Explicit”,這是一個好的編程習慣。

   ● 慎用 Server.MapPath

   除非必須,不要使用Server.MapPath!相反,如果知道路徑,就使用明確的文字路徑來表示。使用MapPath,將要求
IIS去取回當前伺服器路徑,這意味著對IIS一個特殊的請求,從而降低了程式效能。另外的完成這個工作的方法是在局部
變數中儲存路徑資訊,當需要使用它時,伺服器就不用再被過度請求。

   檢查怎樣做

   你可以通過下面的工具來測算伺服器效能:Task Manager,NetMon 和 PerfMon。用WCAT (Web Capacity Analysis
Tool)測量伺服器的容量。你可以使用WCAT來檢查Internet資訊服務和網路設定如何響應不同的用戶端對內容、資料和HTML
頁面的請求。測試的結果可以被用來決定如何最佳化伺服器和網路設定。

   通過最佳化ASP應用程式效能,Web網站應用將會變得很快,最終做到:當不需要時,就不需要去做影響效能的點擊。

   總結

   當談到ASP效能時,要涉及到許多方面,本文已經討論了一些。但是,對於每個具體的應用,應該有單獨的考慮,並
不是這裡討論的技巧都能很合適地滿足。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.