asp.net 程序性能優(yōu)化的七個(gè)方面 (c#(或vb.net)程序改進(jìn))
更新時(shí)間:2009年03月03日 22:59:43 作者:
在我們開(kāi)發(fā)asp.net過(guò)程中,需要注意的一些細(xì)節(jié),以達(dá)到我們優(yōu)化程序執(zhí)行效率。
1、使用值類型的ToString方法
在連接字符串時(shí),經(jīng)常使用"+"號(hào)直接將數(shù)字添加到字符串中。這種方法雖然簡(jiǎn)單,也可以得到正確結(jié)果,但是由于涉及到不同的數(shù)據(jù)類型,數(shù)字需要通過(guò)裝箱操作轉(zhuǎn)化為引用類型才可以添加到字符串中。但是裝箱操作對(duì)性能影響較大,因?yàn)樵谶M(jìn)行這類處理時(shí),將在托管堆中分配一個(gè)新的對(duì)象,原有的值復(fù)制到新創(chuàng)建的對(duì)象中。
使用值類型的ToString方法可以避免裝箱操作,從而提高應(yīng)用程序性能。
int num=1;
string str="go"+num.ToString();
2、運(yùn)用StringBuilder類
String類對(duì)象是不可改變的,對(duì)于String對(duì)象的重新賦值在本質(zhì)上是重新創(chuàng)建了一個(gè)String對(duì)象并將新值賦予該對(duì)象,其方法ToString對(duì)性能的提高并非很顯著。
在處理字符串時(shí),最好使用StringBuilder類,其.NET 命名空間是System.Text。該類并非創(chuàng)建新的對(duì)象,而是通過(guò)Append,Remove,Insert等方法直接對(duì)字符串進(jìn)行操作,通過(guò)ToString方法返回操作結(jié)果。
其定義及操作語(yǔ)句如下所示:
int num;
System.Text.StringBuilder str = new System.Text.StringBuilder(); //創(chuàng)建字符串
str.Append(num.ToString()); //添加數(shù)值num
Response.Write(str.ToString); //顯示操作結(jié)果
3、使用 HttpServerUtility.Transfer 方法在同一應(yīng)用程序的頁(yè)面間重定向
采用 Server.Transfer 語(yǔ)法,在頁(yè)面中使用該方法可避免不必要的客戶端重定向(Response.Redirect)。
4、避免使用ArrayList。
因?yàn)槿魏螌?duì)象添加到ArrayList都要封箱為System.Object類型,從ArrayList取出數(shù)據(jù)時(shí),要拆箱回實(shí)際的類型。建議使用自定義的集合類型代替ArrayList。asp.net 2.0提供了一個(gè)新的類型,叫泛型,這是一個(gè)強(qiáng)類型,使用泛型集合就可以避免了封箱和拆箱的發(fā)生,提高了性能。
5、使用HashTale代替其他字典集合類型
(如StringDictionary,NameValueCollection,HybridCollection),存放少量數(shù)據(jù)的時(shí)候可以使用HashTable.
6、為字符串容器聲明常量,不要直接把字符封裝在雙引號(hào)" "里面。
//避免
MyObject obj = new MyObject();
obj.Status = "ACTIVE";
//推薦
const string C_STATUS = "ACTIVE";
MyObject obj = new MyObject();
obj.Status = C_STATUS;
7、不要用ToUpper(),ToLower()轉(zhuǎn)換字符串進(jìn)行比較,用String.Compare代替,它可以忽略大小寫(xiě)進(jìn)行比較.
例:
const string C_VALUE = "COMPARE";
if (String.Compare(sVariable, C_VALUE, true) == 0)
{
Console.Write( "相同");
}
也可以用str == String.Empty或者str.Length == 0判斷是否為空。(注意判斷輸入數(shù)據(jù)的長(zhǎng)度,可防止sql注入式攻擊)
將String對(duì)象的Length屬性與0比較是最快的方法,避免不必要的調(diào)用 ToUpper 或 ToLower 方法。
8、類型轉(zhuǎn)化Int32.TryParse()優(yōu)于Int32.Parse()優(yōu)于Convert.ToInt32()。
建議.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。
因?yàn)椋?
Convert.ToInt32 會(huì)把最終的解析工作代理給 Int32.Parse;
Int32.Parse 會(huì)把最終的解析工作代理給Number.ParseInt32;
Int32.TryParse 會(huì)把最終的解析工作代理給Number.TryParseInt32。
9、如果只是從XML對(duì)象讀取數(shù)據(jù),用只讀的XPathDocument代替XMLDocument,可以提高性能
//避免
XmlDocument xmld = new XmlDocument();
xmld.LoadXml(sXML);
txtName.Text = xmld.SelectSingleNode( "/packet/child").InnerText;
//推薦
XPathDocument xmldContext = new XPathDocument(new StringReader(oContext.Value));
XPathNavigator xnav = xmldContext.CreateNavigator();
XPathNodeIterator xpNodeIter = xnav.Select( "packet/child");
iCount = xpNodeIter.Count;
xpNodeIter = xnav.SelectDescendants(XPathNodeType.Element, false);
while(xpNodeIter.MoveNext())
{
sCurrValues += xpNodeIter.Current.Value+ ",";
}
10、避免在循環(huán)體里聲明變量,應(yīng)該在循環(huán)體外聲明變量,在循環(huán)體里初始化。
C#程序開(kāi)發(fā)要遵循的一個(gè)基本原則就是避免不必要的對(duì)象創(chuàng)建
//避免
for(int i=0; i<10; i++)
{
SomeClass objSC = new SomeClass();
}
//推薦
SomeClass objSC = null;
for(int i=0; i <10; i++)
{
objSC = new SomeClass();
}
11、捕獲指定的異常,不要使用通用的System.Exception.
//避免
try
{
<some logic>
}
catch(Exception exc)
{
<Error handling>
}
//推薦
try
{
<some logic>
}
catch(System.NullReferenceException exc)
{
<Error handling>
}
catch(System.ArgumentOutOfRangeException exc)
{
<Error handling>
}
catch(System.InvalidCastException exc)
{
<Error handling>
}
12、使用Try...catch...finally時(shí), 要在finally里釋放占用的資源如連接,文件流等
不然在Catch到錯(cuò)誤后占用的資源不能釋放。
try
{}
catch
{}
finally
{
conntion.close();
}
13、不要用Exception控制程序流程
有些程序員可能會(huì)使用異常來(lái)實(shí)現(xiàn)一些流程控制。例如:
try{
result=100/num;
}
Catch(Exception e)
{
result=0;
}
但實(shí)際上,Exception是非常消耗系統(tǒng)性能的。除非必要,不應(yīng)當(dāng)使用異常控制來(lái)實(shí)現(xiàn)程序流程。上面的代碼應(yīng)當(dāng)寫(xiě)為:
if(num!=0)
result=100/num;
else
result=0;
14、避免使用遞歸調(diào)用和嵌套循環(huán),使用他們會(huì)嚴(yán)重影響性能,在不得不用的時(shí)候才使用。
15、禁用VB.net和Jscript動(dòng)態(tài)數(shù)據(jù)類型
應(yīng)當(dāng)始終顯示地申明變量數(shù)據(jù)類型,這能夠節(jié)約程序的執(zhí)行時(shí)間。以往,開(kāi)發(fā)人員喜歡使用 Visual Basic、VBScript 和 JScript 的原因之一就是它們所謂“無(wú)類型”的性質(zhì)。變量不需要顯式類型聲明,并能夠簡(jiǎn)單地通過(guò)使用來(lái)創(chuàng)建它們。當(dāng)從一個(gè)類型到另一個(gè)類型進(jìn)行分配時(shí),轉(zhuǎn)換將自動(dòng)執(zhí)行。不過(guò),這種便利會(huì)大大損害應(yīng)用程序的性能。
如:
為了獲得最佳的性能,當(dāng)聲明 JScript .NET 變量時(shí),請(qǐng)為其分配一個(gè)類型。例如,var A : String;
在連接字符串時(shí),經(jīng)常使用"+"號(hào)直接將數(shù)字添加到字符串中。這種方法雖然簡(jiǎn)單,也可以得到正確結(jié)果,但是由于涉及到不同的數(shù)據(jù)類型,數(shù)字需要通過(guò)裝箱操作轉(zhuǎn)化為引用類型才可以添加到字符串中。但是裝箱操作對(duì)性能影響較大,因?yàn)樵谶M(jìn)行這類處理時(shí),將在托管堆中分配一個(gè)新的對(duì)象,原有的值復(fù)制到新創(chuàng)建的對(duì)象中。
使用值類型的ToString方法可以避免裝箱操作,從而提高應(yīng)用程序性能。
int num=1;
string str="go"+num.ToString();
2、運(yùn)用StringBuilder類
String類對(duì)象是不可改變的,對(duì)于String對(duì)象的重新賦值在本質(zhì)上是重新創(chuàng)建了一個(gè)String對(duì)象并將新值賦予該對(duì)象,其方法ToString對(duì)性能的提高并非很顯著。
在處理字符串時(shí),最好使用StringBuilder類,其.NET 命名空間是System.Text。該類并非創(chuàng)建新的對(duì)象,而是通過(guò)Append,Remove,Insert等方法直接對(duì)字符串進(jìn)行操作,通過(guò)ToString方法返回操作結(jié)果。
其定義及操作語(yǔ)句如下所示:
int num;
System.Text.StringBuilder str = new System.Text.StringBuilder(); //創(chuàng)建字符串
str.Append(num.ToString()); //添加數(shù)值num
Response.Write(str.ToString); //顯示操作結(jié)果
3、使用 HttpServerUtility.Transfer 方法在同一應(yīng)用程序的頁(yè)面間重定向
采用 Server.Transfer 語(yǔ)法,在頁(yè)面中使用該方法可避免不必要的客戶端重定向(Response.Redirect)。
4、避免使用ArrayList。
因?yàn)槿魏螌?duì)象添加到ArrayList都要封箱為System.Object類型,從ArrayList取出數(shù)據(jù)時(shí),要拆箱回實(shí)際的類型。建議使用自定義的集合類型代替ArrayList。asp.net 2.0提供了一個(gè)新的類型,叫泛型,這是一個(gè)強(qiáng)類型,使用泛型集合就可以避免了封箱和拆箱的發(fā)生,提高了性能。
5、使用HashTale代替其他字典集合類型
(如StringDictionary,NameValueCollection,HybridCollection),存放少量數(shù)據(jù)的時(shí)候可以使用HashTable.
6、為字符串容器聲明常量,不要直接把字符封裝在雙引號(hào)" "里面。
//避免
MyObject obj = new MyObject();
obj.Status = "ACTIVE";
//推薦
const string C_STATUS = "ACTIVE";
MyObject obj = new MyObject();
obj.Status = C_STATUS;
7、不要用ToUpper(),ToLower()轉(zhuǎn)換字符串進(jìn)行比較,用String.Compare代替,它可以忽略大小寫(xiě)進(jìn)行比較.
例:
const string C_VALUE = "COMPARE";
if (String.Compare(sVariable, C_VALUE, true) == 0)
{
Console.Write( "相同");
}
也可以用str == String.Empty或者str.Length == 0判斷是否為空。(注意判斷輸入數(shù)據(jù)的長(zhǎng)度,可防止sql注入式攻擊)
將String對(duì)象的Length屬性與0比較是最快的方法,避免不必要的調(diào)用 ToUpper 或 ToLower 方法。
8、類型轉(zhuǎn)化Int32.TryParse()優(yōu)于Int32.Parse()優(yōu)于Convert.ToInt32()。
建議.NET1.1下用Int32.Parse();.NET2.0用Int32.TryParse()。
因?yàn)椋?
Convert.ToInt32 會(huì)把最終的解析工作代理給 Int32.Parse;
Int32.Parse 會(huì)把最終的解析工作代理給Number.ParseInt32;
Int32.TryParse 會(huì)把最終的解析工作代理給Number.TryParseInt32。
9、如果只是從XML對(duì)象讀取數(shù)據(jù),用只讀的XPathDocument代替XMLDocument,可以提高性能
//避免
XmlDocument xmld = new XmlDocument();
xmld.LoadXml(sXML);
txtName.Text = xmld.SelectSingleNode( "/packet/child").InnerText;
//推薦
XPathDocument xmldContext = new XPathDocument(new StringReader(oContext.Value));
XPathNavigator xnav = xmldContext.CreateNavigator();
XPathNodeIterator xpNodeIter = xnav.Select( "packet/child");
iCount = xpNodeIter.Count;
xpNodeIter = xnav.SelectDescendants(XPathNodeType.Element, false);
while(xpNodeIter.MoveNext())
{
sCurrValues += xpNodeIter.Current.Value+ ",";
}
10、避免在循環(huán)體里聲明變量,應(yīng)該在循環(huán)體外聲明變量,在循環(huán)體里初始化。
C#程序開(kāi)發(fā)要遵循的一個(gè)基本原則就是避免不必要的對(duì)象創(chuàng)建
//避免
for(int i=0; i<10; i++)
{
SomeClass objSC = new SomeClass();
}
//推薦
SomeClass objSC = null;
for(int i=0; i <10; i++)
{
objSC = new SomeClass();
}
11、捕獲指定的異常,不要使用通用的System.Exception.
//避免
try
{
<some logic>
}
catch(Exception exc)
{
<Error handling>
}
//推薦
try
{
<some logic>
}
catch(System.NullReferenceException exc)
{
<Error handling>
}
catch(System.ArgumentOutOfRangeException exc)
{
<Error handling>
}
catch(System.InvalidCastException exc)
{
<Error handling>
}
12、使用Try...catch...finally時(shí), 要在finally里釋放占用的資源如連接,文件流等
不然在Catch到錯(cuò)誤后占用的資源不能釋放。
try
{}
catch
{}
finally
{
conntion.close();
}
13、不要用Exception控制程序流程
有些程序員可能會(huì)使用異常來(lái)實(shí)現(xiàn)一些流程控制。例如:
try{
result=100/num;
}
Catch(Exception e)
{
result=0;
}
但實(shí)際上,Exception是非常消耗系統(tǒng)性能的。除非必要,不應(yīng)當(dāng)使用異常控制來(lái)實(shí)現(xiàn)程序流程。上面的代碼應(yīng)當(dāng)寫(xiě)為:
if(num!=0)
result=100/num;
else
result=0;
14、避免使用遞歸調(diào)用和嵌套循環(huán),使用他們會(huì)嚴(yán)重影響性能,在不得不用的時(shí)候才使用。
15、禁用VB.net和Jscript動(dòng)態(tài)數(shù)據(jù)類型
應(yīng)當(dāng)始終顯示地申明變量數(shù)據(jù)類型,這能夠節(jié)約程序的執(zhí)行時(shí)間。以往,開(kāi)發(fā)人員喜歡使用 Visual Basic、VBScript 和 JScript 的原因之一就是它們所謂“無(wú)類型”的性質(zhì)。變量不需要顯式類型聲明,并能夠簡(jiǎn)單地通過(guò)使用來(lái)創(chuàng)建它們。當(dāng)從一個(gè)類型到另一個(gè)類型進(jìn)行分配時(shí),轉(zhuǎn)換將自動(dòng)執(zhí)行。不過(guò),這種便利會(huì)大大損害應(yīng)用程序的性能。
如:
為了獲得最佳的性能,當(dāng)聲明 JScript .NET 變量時(shí),請(qǐng)為其分配一個(gè)類型。例如,var A : String;
相關(guān)文章
詳解VS2017 Linux 上.NET Core調(diào)試
這篇文章主要介紹了詳解VS2017 Linux 上.NET Core調(diào)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
ASP.NET Core 3框架揭秘之 異步線程無(wú)法使用IServiceProvider問(wèn)題
這篇文章主要介紹了ASP.NET Core 3框架揭秘之異步線程無(wú)法使用IServiceProvider問(wèn)題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
Repeater全選刪除和分頁(yè)實(shí)現(xiàn)思路及代碼
Repeater控件想必熟悉.net web開(kāi)發(fā)的人員是很了解不過(guò)的了,接下來(lái)將與大家共同學(xué)習(xí)下它的全選刪除和分頁(yè),感興趣的你可不要錯(cuò)過(guò)了哈,希望可以幫助到你2013-03-03
ASP.NET中TextBox使用Ajax控件顯示日期不全的問(wèn)題解決方法
這篇文章介紹了ASP.NET中TextBox使用Ajax控件顯示日期不全的問(wèn)題解決方法,有需要的朋友可以參考一下2013-10-10
ASP.NET?MVC5網(wǎng)站開(kāi)發(fā)用戶注冊(cè)(四)
上一次把基本框架搭建起來(lái)了,這次開(kāi)始整Web部分,終于可以看到界面了小激動(dòng)一下,web項(xiàng)目部分從用戶功能開(kāi)始,基本有注冊(cè),登錄、注銷、查找、查看、刪除等涉及Member區(qū)域和Manage區(qū)域,供大家參考,具體內(nèi)容如下2015-09-09
在FireFox/IE下Response中文文件名亂碼問(wèn)題解決方案
只是針對(duì)沒(méi)有空格和IE的情況下使用Response.AppendHeader()如果想在FireFox下輸出沒(méi)有編碼的文件,并且IE下輸出的文件名中空格不為+號(hào),就要多一次判斷了,接下來(lái)將詳細(xì)介紹下感興趣的朋友可以了解下,或許對(duì)你有所幫助2013-02-02
ASP.NET與ASP互通COOKIES的一點(diǎn)經(jīng)驗(yàn)
ASP與ASP.NET互相整合時(shí),其中文COOKIES信息無(wú)法被互通共享,當(dāng)使用ASP.NET寫(xiě)入中文COOKIES信息后,使用ASP進(jìn)行讀取,讀出來(lái)的卻是亂碼,而非中文。2010-03-03
詳解在Windows下如何使用AspNetCore Api 和consul
這篇文章主要介紹了詳解在Windows下如何使用AspNetCore Api 和consul,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

