8. 將 SqlDataReader 類用於快速只進資料遊標
SqlDataReader 類提供了一種讀取從 SQL Server 資料庫檢索的只進資料流的方法。如果當建立 ASP.NET 應用程式時出現允許您使用它的情況,則 SqlDataReader 類提供比 DataSet 類更高的效能。情況之所以這樣,是因為 SqlDataReader 使用 SQL Server 的本機網路資料轉送格式從資料庫連接直接讀取資料。另外,SqlDataReader 類實現 IEnumerable 介面,該介面也允許您將資料繫結到伺服器控制項。有關更多資訊,請參見 SqlDataReader 類。有關 ASP.NET 如何訪問資料的資訊,請參見通過 ASP.NET 訪問資料。
9. 將 SQL Server 預存程序用於資料訪問
在 .NET Framework 提供的所有資料存取方法中,基於 SQL Server 的資料訪問是產生高效能、可縮放 Web 應用程式的推薦選擇。使用託管 SQL Server 提供者時,可通過使用編譯的預存程序而不是特殊查詢獲得額外的效能提高。
10. 避免單一執行緒 Apartment (STA) COM 組件
預設情況下,ASP.NET 不允許任何 STA COM 組件在頁面內運行。若要運行它們,必須在 .aspx 檔案內將 ASPCompat=true 屬性包含在 @ Page 指令中。這樣就將執行用的線程池切換到 STA 線程池,而且使 HttpContext 和其他內建對象可用於 COM 物件。前者也是一種效能最佳化,因為它避免了將多執行緒 Apartment (MTA) 封送到 STA 線程的任何調用。
使用 STA COM 組件可能大大損害效能,應盡量避免。若必須使用 STA COM 組件,如在任何 interop 方案中,則應在執行期間進行大量調用並在每次調用期間發送儘可能多的資訊。另外,小心不要在構造頁面期間建立任何 STA COM 組件。例如下面的代碼中,在頁面構造時將執行個體化由某個線程建立的 MySTAComponent,而該線程並不是將運行頁面的 STA 線程。這可能對效能有不利影響,因為要構造頁面就必須完成 MTA 和 STA 線程之間的封送處理。
首選機制是延遲對象的建立,直到以後在 STA 線程下執行.
推薦的做法是在需要時或者在 Page_Load 方法中構造任何 COM 組件和外部資源。
永遠不要將任何 STA COM 組件儲存在可以由構造它的線程以外的其他線程訪問的共用資源裡。這類資源套件括像緩衝和工作階段狀態這樣的資源。即使 STA 線程調用 STA COM 組件,也只有構造此 STA COM 組件的線程能夠實際為該調用服務,而這要求封送處理對建立者線程的調用。此封送處理可能產生重大的效能損失和延展性問題。在這種情況下,請研究一下使 COM 組件成為 MTA COM 組件的可能性,或者更好的辦法是遷移代碼以使對象成為託管對象。
11. 將調用密集型的 COM 組件遷移到Managed 程式碼
.NET Framework 提供了一個簡單的方法與傳統的 COM 組件進行互動。其優點是可以在保留現有投資的同時利用新的平台。但是在某些情況下,保留舊組件的效能開銷使得將組件遷移到Managed 程式碼是值得的。每一情況都是不一樣的,決定是否需要遷移組件的最好方法是對 Web 網站運行效能測量。建議您研究一下如何將需要大量調用以進行互動的任何 COM 組件遷移到Managed 程式碼。
許多情況下不可能將舊式組件遷移到Managed 程式碼,特別是在最初遷移 Web 應用程式時。在這種情況下,最大的效能障礙之一是將資料從非託管環境封送到託管環境。因此,在互動操作中,請在任何一端執行儘可能多的任務,然後進行一個大調用而不是一系列小調用。例如,公用語言運行庫中的所有字串都是 Unicode 的,所以應在調用Managed 程式碼之前將組件中的所有字串轉換成 Unicode 格式。
另外,一處理完任何 COM 物件或本機資源就釋放它們。這樣,其他請求就能夠使用它們,並且最大限度地減少了因稍後請求記憶體回收行程釋放它們所引起的效能問題。
12. 在 Visual Basic .NET 或 JScript 代碼中使用早期繫結
以往,開發人員喜歡使用 Visual Basic、VBScript 和 JScript 的原因之一就是它們所謂“無類型”的性質。變數不需要顯式型別宣告,並能夠簡單地通過使用來建立它們。當從一個類型到另一個類型進行分配時,轉換將自動執行。不過,這種便利會大大損害應用程式的效能。
Visual Basic 現在通過使用 Option Strict 編譯器指令來支援型別安全編程。為了向後相容,預設情況下,ASP.NET 不啟用該選項。但是,為了得到最佳效能,強烈建議在頁中啟用該選項。若要啟用 Option Strict,請將 Strict 屬性包括在 @ Page 指令中,或者,對於使用者控制項,請將該屬性包括在 @ Control 指令中。下面的樣本示範了如何設定該屬性,並進行了四個變數調用以顯示使用該屬性是如何導致編譯器錯誤的。
JScript .NET 也支援無類型編程,但它不提供強制早期繫結的編譯器指令。若發生下面任何一種情況,則變數是晚期綁定的:
被顯式聲明為 Object。
是無型別宣告的類的欄位。
是無顯式型別宣告的專用函數或方法成員,並且無法從其使用推斷出類型。
最後一個差別比較複雜,因為如果 JScript .NET 編譯器可以根據變數的使用方式推斷出類型,它就會進行最佳化。在下面的樣本中,變數 A 是早期繫結的,但變數 B 是晚期綁定的。
以下是引用片段:
var A;
var B;
A = "Hello";
B = "World";
B = 0;
為了獲得最佳的效能,當聲明 JScript .NET 變數時,請為其分配一個類型。例如,var A : String。
【待續...】