分享提高ASP.NET Web應(yīng)用性能的技巧
在這篇文章中,將介紹一些提高 ASP.NET Web 應(yīng)用性能的方法和技巧。眾所周知,解決性能問題是一項繁瑣的工作,當(dāng)出現(xiàn)性能問題,每個人都會歸咎于編寫代碼的開發(fā)人員。
那性能問題到底該如何解決?以下是應(yīng)用系統(tǒng)發(fā)布前,作為 .NET 開發(fā)人員需要檢查的點。
1.debug=「false」
當(dāng)創(chuàng)建 ASP.NET Web應(yīng)用程序,默認(rèn)設(shè)置為「true」。開發(fā)過程中,設(shè)置為「true」是非常有用多,但在應(yīng)用程序發(fā)布部署時,需將其設(shè)置為「false」。
<compilation defaultLanguage="C#" debug="false" targetFramework="4.0" />
2.關(guān)閉 tracing(追蹤)
tracing 是非??膳碌?,你有沒有忘記關(guān)閉它。假如沒用,請確定編輯 web.config 并且關(guān)閉它。它將占用大量您的程序資源。
<trace enabled="false" requestLimit=”10” pageoutput=”false” traceMode=”SortByTime” localOnly=”true”>
3.禁用 session
假如您用不到 session 會話跟蹤請務(wù)必禁用它。您可以在每個 asp.net 頁面中設(shè)置如下:
<%@ page language="c#" codebehind="webform1.aspx.cs" autoeventwireup="false" inherits="webapplication1.webform1" enablesessionstate="false" %>
4.使用發(fā)布版本部署應(yīng)用
部署應(yīng)用程序到生產(chǎn)環(huán)境時,要確保使用的發(fā)布版本模式,而不是調(diào)試模式。如果使用調(diào)試模板極容易發(fā)生請求超時。部署成發(fā)布版本,你將會發(fā)現(xiàn)速度有很大的提升。
5.關(guān)閉頁面的 View State
View State 主要是在提交以后回顯用的,它只有在頁面中的數(shù)據(jù)是提交到本頁時才有用。其默認(rèn)是「true」。如果你沒有使用表單數(shù)據(jù)回傳,那么可以關(guān)閉 View State。
<%@ Page EnableViewState="false" %>
6.避免使用 Response.Redirect
Redirect(重定向)非常麻煩,它僅用于用于從當(dāng)前物理服務(wù)器開發(fā)跳轉(zhuǎn)到其它服務(wù)器。如果只是在本服務(wù)器開發(fā)內(nèi)頁面跳轉(zhuǎn)請使用 Server.Transfer 語法,這樣會減少很多沒有必要的客戶端重定向。
7.運用 StringBuilder 類以及使用 ToString()方法
String 類對象是不可改變的,對于 String 對象的重新賦值在本質(zhì)上是重新創(chuàng)建了一個 String 對象并將新值賦予該對象,其方法 ToString 對性能的提高并非很顯著。在處理字符串時,最好使用 StringBuilder 類,其 .NET 命名空間是 System.Text。該類并非創(chuàng)建新的對象,而是通過 Append,Remove,Insert 等方法直接對字符串進行操作,通過 ToString 方法返回操作結(jié)果。 其定義及操作語句如下所示
int num; System.Text.StringBuilder str = new System.Text.StringBuilder(); //創(chuàng)建字符串 str.Append(num.ToString()); //添加數(shù)值num Response.Write(str.ToString); //顯示操作結(jié)果
8.避免拋出異常
異常會導(dǎo)致速度變慢,并且使得應(yīng)用程序頁面顯示異常,使得無法進行其他操作??梢允褂?try / catch 使出現(xiàn)的異常記錄到日志文件中。
9.使用 finally 方法回收資源
假如你在應(yīng)用開發(fā)中大量使用其他數(shù)據(jù)庫連接和訪問文件,請確定在用完后關(guān)閉它們。finally 塊是程序中最后被執(zhí)行,因此在這里面的代碼會確保一定會被執(zhí)行,關(guān)閉代碼一定要在這個開發(fā)方法塊中執(zhí)行。
10.使用客戶端腳本驗證
用客戶端驗證代替服務(wù)器開發(fā)端驗證。服務(wù)器開發(fā)端數(shù)據(jù)驗證將會大量消耗您的服務(wù)器開發(fā)上的資源,并且會代來大量的頁面數(shù)據(jù)回傳。
11.使用 Page.IsPostback
請確保不執(zhí)行過多的回傳代碼。使用 Page.IsPostBack 屬性,以確保只執(zhí)行頁面初始化邏輯,當(dāng)一個頁面第一次加載,而不向響應(yīng)客戶回發(fā)。
12.使用分頁
大多數(shù) Web 應(yīng)用程序數(shù)據(jù)是以表格形式顯示。分頁有利用應(yīng)用開發(fā)程序效率。每次盡量顯示小部分?jǐn)?shù)據(jù),這樣會加快頁面顯示速度。
13.使用 Ajax 異步調(diào)用
使用 Ajax 方法,進行異步調(diào)用。
14.刪除未使用的 HttpModules
對于 httpModules,我們可以理解為:建立一個通用的可用被插入任何 Web 應(yīng)用程序的 HttpApplication 事件鉤子。使用 HttpModule 是可復(fù)用的,不需要特定語應(yīng)用程序代碼的,只需要 web.config 中的一個條目。 在 web.config 文件中,刪除未使用的 HttpModules。
15.避免遞歸函數(shù)/嵌套循環(huán)
在任何編程語言中都需避免嵌套循環(huán)和遞歸函數(shù),以提高性能。
16.不使用不必要的 Server Control
ASP.NET 中,大量的服務(wù)器端控件方便了程序開發(fā),但也可能帶來性能的損失,因為用戶每操作一次服務(wù)器端控件,就產(chǎn)生一次與服務(wù)器端的往返過程。因此,非必要,應(yīng)當(dāng)少使用 Server Control。
17.調(diào)用多個操作時,請使用多線程
問題出現(xiàn)時,單線程卡在此問題上長時間運行。因此,可以使用多個線程以提高應(yīng)用程序的響應(yīng)速度。
18.數(shù)據(jù)庫的連接和關(guān)閉
訪問數(shù)據(jù)庫資源需要創(chuàng)建連接、打開連接和關(guān)閉連接幾個操作。這些過程需要多次與數(shù)據(jù)庫交換信息以通過身份驗證,比較耗費服務(wù)器資源。ASP.NET 中提供了連接池(Connection Pool)改善打開和關(guān)閉數(shù)據(jù)庫對性能的影響。系統(tǒng)將用戶的數(shù)據(jù)庫連接放在連接池中,需要時取出,關(guān)閉時收回連接,等待下一次的連接請求。連接池的大小是有限的,如果在連接池達(dá)到最大限度后仍要求創(chuàng)建連接,必然大大影響性能。因此,在建立數(shù)據(jù)庫連接后只有在真正需要操作時才打開連接,使用完畢后馬上關(guān)閉,從而盡量減少數(shù)據(jù)庫連接打開的時間,避免出現(xiàn)超出連接限制的情況。
19.將 SqlDataReader 類用于快速只進數(shù)據(jù)游標(biāo)
SqlDataReader 類提供了一種讀取從 SQL Server 數(shù)據(jù)庫檢索的只進數(shù)據(jù)流的方法。如果當(dāng)創(chuàng)建 ASP.NET 應(yīng)用程序時出現(xiàn)允許您使用它的情況,則 SqlDataReader 類提供比 DataSet 類更高的性能。情況之所以這樣,是因為 SqlDataReader 使用 SQL Server 的本機網(wǎng)絡(luò)數(shù)據(jù)傳輸格式從數(shù)據(jù)庫連接直接讀取數(shù)據(jù)。另外,SqlDataReader 類實現(xiàn) IEnumerable 接口,該接口也允許您將數(shù)據(jù)綁定到服務(wù)器控件。有關(guān)更多信息,請參見 SqlDataReader 類。有關(guān) ASP.NET 如何訪問數(shù)據(jù)的信息,請參見通過 ASP.NET 訪問數(shù)據(jù)。
20.高性能的 SQL 語句規(guī)則
- 盡量避免全表掃描
- 盡量避免在 where 子句中對字段進行 null 值判斷
- 盡量避免在 where 子句中使用 != 或 <> 操作符
- 盡量避免在 where 子句中使用 or 來連接條件
- in 和 not in 也要慎用
- 不要在 where 子句中的「=」左邊進行函數(shù)、算術(shù)運算或其他表達(dá)式運算
- Update 語句,如果只更改1、2個字段,不要Update全部字段
- 對于多張大數(shù)據(jù)量(這里幾百條就算大了)的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差
- 盡可能的使用 varchar/nvarchar 代替 char/nchar
21.緩存
緩存是一種用空間換取時間的技術(shù),通俗點也就是說把你得到的數(shù)據(jù)存放在內(nèi)存中一段時間,在這短時間內(nèi)服務(wù)器不去讀取數(shù)據(jù)庫、或是真實的數(shù)據(jù)源,而是讀取你存放在內(nèi)存中的數(shù)據(jù)。 緩存是網(wǎng)站性能優(yōu)化不可缺少的一種數(shù)據(jù)處理機制,他能有效的緩解數(shù)據(jù)庫壓力。 ASP.NET 中的緩存主要分為:
- 頁面緩存
- 數(shù)據(jù)源緩存
- 自定義數(shù)據(jù)緩存
22.做負(fù)載均衡和服務(wù)器加成
負(fù)載均衡不應(yīng)該僅僅被看作是實現(xiàn)可擴展性的一種手段。盡管它肯定提高了可擴展性,很多時候它增加了 Web 應(yīng)用程序的性能,因為請求和用戶都散發(fā)著多個服務(wù)器。
23.通過 FxCop 做代碼檢查和優(yōu)化
FxCop 是一個代碼分析工具,它使用基于規(guī)則的引擎,來檢查出你代碼中不合規(guī)范的部分;你也可以定制自己的規(guī)則加入到這個引擎。其中的一些規(guī)則是:
- 避免過多的局部變量
- 避免使用未調(diào)用的私有代碼
- 避免未實例化的內(nèi)部類
- 避免使用未密封的特性
- 避免進行不必要的強制轉(zhuǎn)換
- 以內(nèi)聯(lián)方式初始化引用類型的靜態(tài)字段
- 用 NeutralResourcesLanguageAttribute 標(biāo)記程序集
- 將成員標(biāo)記為 Static 等等。
24.ASP.NET 性能監(jiān)控工具
這些是用于監(jiān)視代碼的性能的工具。
- .NET 內(nèi)存分析器
- Red Gate ANTS 性能分析工具
- Fiddler
- 性能計數(shù)器
以上是一些性能調(diào)整的提示。性能調(diào)優(yōu)不是一天兩天的工作,而是一個反反復(fù)復(fù)的過程。對于網(wǎng)站開發(fā)人員來說,在編寫 ASP.NET 應(yīng)用程序時注意性能問題,養(yǎng)成良好的習(xí)慣,提高應(yīng)用程序性能,至少可以推遲必需的硬件升級,降低網(wǎng)站的成本。
相關(guān)文章
.Net?Core應(yīng)用增強型跨平臺串口類庫CustomSerialPort()詳解
本文詳細(xì)講解了.Net?Core應(yīng)用增強型跨平臺串口類庫CustomSerialPort(),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01.NET AppSettings與ConnectionStrings使用案例詳解
這篇文章主要介紹了.NET AppSettings與ConnectionStrings使用案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08asp.net core 認(rèn)證和授權(quán)實例詳解
這篇文章主要為大家介紹了asp.net core 認(rèn)證和授權(quán)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09asp.net頁面觸發(fā)事件panel滾動條高度不變的實現(xiàn)方法
asp.net頁面按鈕點擊觸發(fā)事件后panel滾動條非自動回到頂端,每次都要往下拉一下,關(guān)于這個問題的解決方法如下2014-11-11DataTable轉(zhuǎn)成字符串復(fù)制到txt文本的小例子
DataTable轉(zhuǎn)成字符串復(fù)制到txt文本的小例子,需要的朋友可以參考一下2013-03-03asp.net Cookie跨域、虛擬目錄等設(shè)置方法
Cookie跨域、虛擬目錄等設(shè)置方法,需要的朋友可以參考下。2009-11-11.net中如何以純二進制的形式在內(nèi)存中繪制一個對象
這篇文章主要介紹了如何以純二進制的形式在內(nèi)存中繪制一個對象,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07.NET實現(xiàn)Repeater控件+AspNetPager控件分頁
本文給大家分享的2個示例,演示AspNetPager最基本的功能,幫助您認(rèn)識AspNetPager分頁控件及了解它的工作原理。有需要的小伙伴可以參考下2015-11-11