精簡(jiǎn)高效的C#網(wǎng)站優(yōu)化經(jīng)驗(yàn)技巧總結(jié)
對(duì)大型網(wǎng)站,技術(shù)涉及面非常廣,對(duì)硬件,軟件,編程語(yǔ)言,Web Service,防火墻等等有很高要求。
面對(duì)大量用戶,高并發(fā)請(qǐng)求,可以使用高性能服務(wù)器,高性能編程語(yǔ)言,高性能數(shù)據(jù)庫(kù),加大帶寬等,這意味著巨大的投入。
如果你沒有這樣的打算,而又想獲得更好的系統(tǒng)性能,則需要我們精打細(xì)算,從"軟"的方面著手。
如果你有過以下的一些用法,或者有不同見解,請(qǐng)賜教。
(1)Foreach比f(wàn)or有更好的執(zhí)行效率。
Foreach所花的時(shí)間大約只有for的30%,通過測(cè)試結(jié)果,在兩者都可以使用的情況下,我們推薦效率更高的Foreach。另外用for寫入數(shù)據(jù)的時(shí)間大約是讀取數(shù)據(jù)時(shí)間的10倍。
(2)避免使用ArrayList
因?yàn)槿魏螌?duì)象存放到里面,都要轉(zhuǎn)化為System.Object類型,從ArrayList中取出數(shù)據(jù)要拆箱回原來的類型。建議使用.NET2.0的泛型,這是一個(gè)強(qiáng)類型,可以避免裝箱拆箱的性能消耗。
(3)不要使用UpperCase,LowerCase轉(zhuǎn)換字符串,再進(jìn)行比較。用String.Compare代替,他可以忽略大小寫進(jìn)行比較。
(4)用StringBuilder代替字符串連接符"+"
原因,見我的另一篇文章String 和BulidString性能比較和內(nèi)在機(jī)制
(5)避免在循環(huán)內(nèi)聲明變量,應(yīng)該在循環(huán)外聲明變量,在循環(huán)里初始化
//避免 for(int i=0;i<10;i++) { AnyClass cl=new AnyClass(); //…… } //推薦 for(int i=0;i<10;i++) { cl=new AnyClass(); //……
(6)捕獲異常,不用使用System.Exception
//避免 try { //TODO } catch (Exception ex) { //TODO(雖然簡(jiǎn)單,但性能較差) } //推薦 try { //TODO } catch (System.NullReferenceException ex) { //對(duì)空對(duì)象異常處理 } catch (System.ArgumentOutOfRangeException ex) { //超出范圍異常處理 } catch (System.InvalidCastException ex) { //對(duì)異常轉(zhuǎn)化的處理 }
(7)不要使用異??刂瞥绦蛄鞒?。
異常捕獲對(duì)性能的消耗很大,眾所周知的,能避免使用最好不用
//避免 try { result=200/num; } catch (Exception ex) { result=0 } //推薦 try { result=num!=0?200/num:0; } catch (Exception ex) { result=0 }
(8)在遇到調(diào)用實(shí)現(xiàn)IDisposable對(duì)象的時(shí)候,用Using和try/finally來釋放資源
//避免 public void ExceuteCommand() { SqlConnection sql=new SqlConnection(strCon); SqlCommand cmd=new SqlCommand(sql); sql.Dispose();//上面出錯(cuò),此處有可能永遠(yuǎn)都調(diào)用不到 cmd.Dispose(); } //建議 //Using內(nèi)并不是可以放任何對(duì)象,只有實(shí)現(xiàn)了IDisposable接口的對(duì)象才能被使用。 //編譯器成IL時(shí)候,Using會(huì)自動(dòng)把內(nèi)容放在try/finally里面。 try { using(SqlConnection sql=new SqlConnection(strCon)) { using(SqlCommand cmd=new SqlCommand(sql)) { //TODO } } } catch (Exception ex) { // } finally{ //或者 //sql.Dispose(); //cmd.Dispose(); } //推薦 因?yàn)槿绻龅蕉鄠€(gè)實(shí)現(xiàn)IDisposable接口的對(duì)象需要釋放,try/finally更好些 //推薦 SqlConnection sql=null; SqlCommand cmd=null; try { sql=new SqlConnection(strCon); cmd=new SqlCommand(sql); sql.Open(); cmd.ExecuteNonQuery(); } finally{ if(sql!=null) sql.Dispose(); if(cmd!=null) cmd.Dispose(); }
(9)避免使用反射,反射是比較浪費(fèi)性能的操作
通過反射來調(diào)用類型或方法,字段或?qū)傩允荂LR要做更多的工作,如校驗(yàn)參數(shù),檢查權(quán)限,所以速度是非常慢的。對(duì)于打算寫一個(gè)動(dòng)態(tài)構(gòu)造類型(晚綁定)的應(yīng)用程序,可以通過繼承,接口,委托來實(shí)現(xiàn)。
(10)值類型組合成字符串,請(qǐng)使用.ToStrng()方法,避免裝箱操作。
//避免 var str="hello"+1+2; //推薦 var str="hello"+1.ToString()+2.ToString();
(11)StopWatch類測(cè)試運(yùn)行時(shí)間
public delegate void AddHandler(); class Program { static void Main(string[] args) { Utility.ProcessTimeSpan(Program.Add); Console.Read(); } public static void Add() { var a = 0; for (int i = 0; i < 100000000; i++) { a++; } } } public static class Utility { public static void ProcessTimeSpan(AddHandler addDelegate) { //推薦 DateTime start = DateTime.Now; var timer = Stopwatch.StartNew(); addDelegate(); timer.Stop(); Console.WriteLine("Method took {0} ms", timer.ElapsedMilliseconds); //傳統(tǒng) DateTime start = DateTime.Now; SomeCodeToTime(); DateTime end = DateTime.Now; Console.WriteLine("Method took {0} ms", (end - start).TotalMilliseconds); } }
以上就是精簡(jiǎn)高效的C#網(wǎng)站優(yōu)化經(jīng)驗(yàn)技巧總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C#網(wǎng)站優(yōu)化經(jīng)驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
對(duì)指定的網(wǎng)頁(yè)進(jìn)行截圖的效果 C#版
對(duì)指定的網(wǎng)頁(yè)進(jìn)行截圖的效果 C#版...2007-08-08使用VS2010 C#開發(fā)ActiveX控件(下),完整代碼打包下載
我們介紹了開發(fā)、打包、發(fā)布、使用ActiveX控件的全過程。在演示程序中,我們沒有調(diào)用串口通信和讀卡器Dll程序,由于我們讀卡器的原始Dll是使用其它語(yǔ)言進(jìn)行開發(fā)的,對(duì)C#來說,是非托管代碼,因此我們還需要在代碼級(jí)別進(jìn)行非托管代碼的安全性設(shè)置2011-05-05詳解C#實(shí)例化對(duì)象的三種方式及性能對(duì)比
這篇文章主要介紹了C#實(shí)例化對(duì)象的三種方式及性能對(duì)比,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12C#實(shí)現(xiàn)ComboBox變色的示例代碼
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)ComboBox變色的效果,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01C#實(shí)現(xiàn)合并多個(gè)word文檔的方法
這篇文章主要介紹了C#實(shí)現(xiàn)合并多個(gè)word文檔的方法,是C#針對(duì)Word文檔操作的一個(gè)非常重要的技巧,需要的朋友可以參考下2014-09-09