如何增強ASP程式效能(2)

來源:互聯網
上載者:User
程式|效能 如何增強ASP程式效能(2)
2000-08-11· 編譯:甘冀平·Yesky

技巧6:聰明地使用Session對象

  Session在繁忙網站上使用時有幾個缺陷。繁忙的意思是:網站上每秒有上百的頁面被請求,或者同時有上千的訪問使用者。這個技巧對於那些要求水平擴充強的網站非常重要,也就是指這些網站:它們利用多個伺服器完成資料裝載或者處理大量容錯。對於小型網站,比如內部網Intranet,Session是非常值得提倡的。

  再次重申,ASP自動地為每一個首次點擊Web伺服器的使用者建立一個Session,每一個Session佔有大約10KB的記憶體,生存期預設是20分鐘。

  使用Session最大的問題不是效能,而是擴充性,Session不能跨越多個Web伺服器,一旦在一個伺服器上建立了Session,它的資料就駐留在那裡。這意味著,如果在Web上使用Session,你就得為每一個直接存取存放Session伺服器的使用者請求設計一個策略。這就是將使用者“粘”在Web伺服器上,術語“sticky sessions”就來源於此。如果Web伺服器遇到障礙,“Stuck”使用者就會丟失他們的Session狀態,因為Session不保留在磁碟上。

  執行粘性session的策略包括硬體與軟體解決方式,比如windows2000進階伺服器中的 Network Load Balancing 以及Cisco公司的Local Director,但換取這些要犧牲一定的擴充性。

  Application對象也不能跨越伺服器。如果需要在Web群中共用並更新Application資料,就需要使用後台資料庫。然而,唯讀Application資料在Web群中仍然很有用。

  許多對任務要求嚴格的網站都要設立至少2個Web伺服器,所以在設計嚴格任務的應用程式時,就需要執行“sticky sessions”,或者簡單地避免使用Session,同時也可以採取其他儲存使用者狀態到獨立Web伺服器的管理技術。

  如果不使用Session,一定要確認將它們關閉,這可以通過Internet服務管理員實現。如果決定使用Session,可以通過幾種方法來最小化它們的影響。

  可以將不需要Session的內容(比如協助畫面,訪問者地區,等等)移動到關閉Session的獨立ASP應用程式中。在基礎頁面上,可以給ASP一個指示,讓它不需要使用Session。將下面的代碼直接加入到ASP頁面的頭部:

<% @EnableSessionState=False %>

  使用這個指示的一個很好的解釋是在架構結構中Session建立了一個有趣的問題。ASP確保在一個時刻只有一個來自Session的請求被執行,這就確保了如果瀏覽器為單個使用者請求多個頁面時,只有一個ASP請求在那時能夠接受Session,如此就避免了存取Session對象時的多線程問題。很不幸,在架構結構中的所有頁面將按照連續的順序顯示出來,一個接一個,而不是同時,所以使用者為了看到整個架構必須要等很長時間。規則是:如果一定的架構頁面沒有使用Session,就一定要告訴ASP直接使用@EnableSessionState=False。

  除了使用Session對象,還有許多其他管理工作階段狀態的選擇。對於小數量的狀態(小於4KB),我們通常建議使用cookie、查詢字串變數以及表單隱藏欄位。對於象購物車一樣的大數量資料,後台資料庫是最合適的選擇。

技巧7:將代碼裝入COM對象中

  如果要編寫很多VBScript或者JScript,為了提個效能,可以將代碼編寫成COM對象並且編譯使用。編譯代碼基本上比解釋性代碼運行快許多,編譯組件對象可通過“early binding”存取其他COM對象,這比在指令碼中調用組件要有效。

這麼做有許多優點:

COM對象有益於從商業規則中獨立出運算式規則
COM對象使代碼重用變為可能
許多開發人員發現用VB,C++或者Visual J++編寫程式,比ASP更容易調試
  COM對象也有缺點,包括初始開發時間和對不同編程技巧的需要。注意將少量ASP代碼做成COM對象組件不會有好處,反而可能導致效能的損失,從而失去了編譯代碼的優勢。怎樣組合使用ASP指令碼和COM對象達到最佳效能是一個測試的問題。我們注意到微軟公司已經大規模在Windows 2000/IIS 5.0上提高了指令碼與ADO的效能,由此,隨著IIS5.0版本的引進,減少了編譯代碼的效能優勢。

技巧8:使用Option Explicit

  要在ASP檔案中使用Option Explicit定義,並且放置到ASP檔案的頭部,從而強迫開發人員在使用前聲明所有的變數。許多程式員都認為這在應用程式調試時非常有用,因為它避免了產生錯誤類型變數以及偶然建立新變數的可能。

也許更重要的是,聲明的變數要大大快於非聲明變數。

技巧9:拷貝經常使用的資料到指令碼變數中

  在ASP中存取COM對象時,應該拷貝經常使用的對象資料到指令碼變數中,這樣就減少了對COM對象的方法調用。這些調用要比存取指令碼變數相對來說費時費力。當存取Collection和Dictionary對象時,使用這項技巧也減少了昂貴的尋找操作。

  通常,如果要不止一次地存取對象資料,就應將資料放入指令碼變數中,對象資料主要也就是Request變數(表單和查詢字串變數)。比如,網站要傳遞一個叫做UserID的查詢字串變數,假設它將在一個特殊頁面被引用12次,那麼不需要調用Request(“UserID”)12次,只要在ASP頁面的頭部分配給UserID一個變數,然後在頁面中使用它,這樣做就節省了11次COM方法的調用。

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

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

上面的代碼執行後,發生以下事情:

1、變數Foo被當作全域對象
2、變數bar被當作Foo的一員
3、變數blah被當作Foo.bar的一員
4、變數qaz被當作Foo.bar.blah的一員
5、調用Foo.bar.blah.quaz(1)
6、再執行步驟1到3分解baz
7、分解baz做為Foo.bar.blah的一員
8、再執行步驟1到3分解zaq
9、再執行步驟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


注意:這個技巧也可以應用在VB編程中。

技巧10:避免再定義數組

  爭取不要再定義數組。考慮到效能問題,如果機器的實體記憶體大小不夠,最好按最差情況或者最佳情況設定數組的初始尺寸,需要時再重新定義。

下面的代碼展示了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"
% >

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



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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