C性能優(yōu)化最佳實踐_第1頁
C性能優(yōu)化最佳實踐_第2頁
C性能優(yōu)化最佳實踐_第3頁
C性能優(yōu)化最佳實踐_第4頁
C性能優(yōu)化最佳實踐_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、C# 性能優(yōu)化最佳實踐1、顯式注冊的EvenHandler要顯式注銷以避免內(nèi)存泄漏將一個成員方法注冊到某個對象的事件會造成后者持有前者的引用。在事件注銷之前,前者不會被垃圾回收。csharp view plain copyprivate void Form1_Load() /注冊事件 CommandRemotingContext.CmdChanged += new ReciverCmdStateChangedEventHandler(this.CommandRemotingContext_CmdChanged); private void Form1_FromClosed() /關(guān)閉窗體時及時

2、釋放事件 CommandRemotingContext.CmdChanged -= new ReciverCmdStateChangedEventHandler(this.CommandRemotingContext_CmdChanged); 由事件引起的內(nèi)存泄漏問題:對象A訂閱了對象B中的事件對象A的生命周期遠(yuǎn)遠(yuǎn)大于對象B對象A沒有取消訂閱對象B的時間最終導(dǎo)致對象B無法釋放2、控件綁定的數(shù)據(jù)源批量操作應(yīng)避免自動刷新客戶端批量操作數(shù)據(jù)時,控件自帶的刷新操作,會造成不必要的時間消耗當(dāng)數(shù)據(jù)源(如DataTable、Array、List、ObservableCollection或其他IListSou

3、rce等)被綁定到控件時,批量操作數(shù)據(jù)時應(yīng)該斷開綁定或掛起控件的刷新。csharp view plain copythis.gcBillList.DataSource = null; DataRowCollection rows = this.ds.Tables0.Rows; foreach (DataRow row in rows) / DataRow數(shù)據(jù)操作 this.gcBillList.DataSource = this.ds.Tables0.DefaultView; 3、減少客戶端與服務(wù)端的通信次數(shù)WebService調(diào)用并非越少越好,傳輸數(shù)據(jù)量較大的情況可考慮拆分為多次調(diào)用對于短W

4、ebService的調(diào)用,應(yīng)盡量合并以減少交互次數(shù)csharp view plain copy/多次調(diào)用了相同的WS txtCompanyName.Text=SCPubFunctionClient.PublicWSCal<string>(“ForTest”, “GetCompanyNameByID”,“0001”); txtCompanyInnerName.Text=SCPubFunctionClient.PublicWSCal<string>(“ForTest”, “GetCompanyInnerNameByID”,“0001”); /合并相鄰的WS string r

5、esult=SCPubFunctionClient.PublicWSCal<string>(“ForTest”, “GetCompanyNameAndInnerNameByID”,“0001”); txtCompanyName.Text=result0; txtCompanyInnerName.Text= result1; 4、減少客戶端與服務(wù)端的通信次數(shù)如非必要,應(yīng)盡量避免在循環(huán)體內(nèi)重復(fù)調(diào)用WebServicecsharp view plain copy/循環(huán)調(diào)用了相同的WS List<Person> persons; foreach(string personID

6、in personIDs) person=HRPubWsClient.getPerson(personID); persons.Add(person); /合并WS List<Person> persons; persons =HRPubWsClient.getPersonList(personIDs); 5、使用泛型來避免裝箱、拆箱操作(減少垃圾回收壓力)裝箱操作會造成GC壓力;如果發(fā)生在集合中,應(yīng)該使用泛型集合避免。對于值類型的集合,使用List<T>來代替ArrayList,使用Dictionary<TKey, TValue> 來代替Hashtable

7、。csharp view plain copyArrayList h=new ArrayList(); /不建議 h.Add(1); List<object> h = new List<object>(); /不建議 h.Add(1); List<int> h = new List<int>(); /建議 h.Add(1); 6、字符串操作: C# 字符串操作-減少垃圾回收壓力7、使用常量避免創(chuàng)建對象如下例,程序中存在大量 new decimal(0)的代碼,這會導(dǎo)致小對象頻繁創(chuàng)建及回收;正確的做法是使用 Decimal.Zero 常量。csha

8、rp view plain copyprivate string CurrencyCalc() if (firstValue = new decimal(0) if (secondValue = new decimal(0) if (thirdValue = new decimal(0) if (fourthValue = new decimal(0) 8、避免不必要的拋出異常C# 異常處理(Catch Throw)IL分析9、使用RemoveAll而非RemoveAt進(jìn)行刪除多個元素使用RemoveAll方法對集合(如List)中的多個元素進(jìn)行一次性刪除時,只會對List的內(nèi)部數(shù)組做一次re

9、size 操作,效率明顯高于循環(huán)調(diào)用RemoveAt。csharp view plain copyList<string> lst = new List<string> "1", "2", "3", "1", "2", "4" /不建議: for (int i = lst.Count - 1; i >= 0; i-) if (lsti = "1" | lsti = "2") lst.RemoveAt(i);

10、 /建議: lst.RemoveAll(s => s = "1" | s = "2"); 10、C# DataSet性能最佳實踐11、反射與動態(tài)綁定-減少CPU占用反射技術(shù)是將編譯期間的靜態(tài)綁定轉(zhuǎn)換為延遲到運行期間的動態(tài)綁定。C#主要支持 5 種動態(tài)創(chuàng)建對象的方式(時間消耗來自網(wǎng)絡(luò),與我實測的差距挺大,具體測試見下方):應(yīng)盡量避免使用反射和動態(tài)綁定;如必須使用,要遵循以下原則:1 使用接口調(diào)用方式將動態(tài)綁定改造為早期綁定(Direct Call)2 使用 Activator.CreateInstance(Type)方式動態(tài)創(chuàng)建對象3 使用typeo

11、f操作符代替GetType調(diào)用小注:通過循環(huán)創(chuàng)建實例記錄時間如下:加載程序集、獲取類型在循環(huán)外部時間如下(這時不同創(chuàng)建方式消耗時間差距挺大):代碼如下:csharp view plain copypublic void TestCreateInstance() Stopwatch watch1 = new Stopwatch(); var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); Type type = asmb.GetType("ReflectiveClassLibrary.TestClass

12、"); int num = 100000; watch1.Start(); for (int i = 0; i < num; i+) /var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); /Type type = asmb.GetType("ReflectiveClassLibrary.TestClass"); Activator.CreateInstance(type); watch1.Stop(); label1.Text = "Activator.Crea

13、teInstance(Type type)時間:" + watch1.ElapsedMilliseconds + "毫秒" watch1.Reset(); watch1.Start(); for (int i = 0; i < num; i+) Activator.CreateInstance("ReflectiveClassLibrary", "ReflectiveClassLibrary.TestClass"); watch1.Stop(); label2.Text = "Activator.Create

14、Instance(string assemblyName,string typeName)時間:" + watch1.ElapsedMilliseconds + "毫秒" watch1.Reset(); watch1.Start(); for (int i = 0; i < num; i+) /var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); /加載程序集 asmb.CreateInstance("TestClass"); watch1.Stop()

15、; label3.Text = "assembly.CreateInstance(string typeName)時間:" + watch1.ElapsedMilliseconds + "毫秒" watch1.Reset(); watch1.Start(); for (int i = 0; i < num; i+) /var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); /Type type = asmb.GetType("ReflectiveClass

16、Library.TestClass"); object obj = type.InvokeMember(null, BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null); watch1.Stop(); label4.Text = "Type.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object args)時間:"

17、+ watch1.ElapsedMilliseconds + "毫秒" watch1.Reset(); watch1.Start(); for (int i = 0; i < num; i+) /var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); /Type type = asmb.GetType("ReflectiveClassLibrary.TestClass"); ConstructorInfo constructorInfo = type.GetCons

18、tructors()0; constructorInfo.Ioke(null); watch1.Stop(); label5.Text = "ContructorInfo.Invoke(object parameters)時間:" + watch1.ElapsedMilliseconds + "毫秒" 加載程序集、獲取類型在循環(huán)內(nèi)部時間如下(這時不同創(chuàng)建方式消耗時間差距比較?。捍a如下:csharp view plain copypublic void TestCreateInstance() Stopwatch watch1 = new Stopwa

19、tch(); /var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); /Type type = asmb.GetType("ReflectiveClassLibrary.TestClass"); int num = 100000; watch1.Start(); for (int i = 0; i < num; i+) var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); Type type = a

20、smb.GetType("ReflectiveClassLibrary.TestClass"); Activator.CreateInstance(type); watch1.Stop(); label1.Text = "Activator.CreateInstance(Type type)時間:" + watch1.ElapsedMilliseconds + "毫秒" watch1.Reset(); watch1.Start(); for (int i = 0; i < num; i+) Activator.CreateIns

21、tance("ReflectiveClassLibrary", "ReflectiveClassLibrary.TestClass"); watch1.Stop(); label2.Text = "Activator.CreateInstance(string assemblyName,string typeName)時間:" + watch1.ElapsedMilliseconds + "毫秒" watch1.Reset(); watch1.Start(); for (int i = 0; i < num;

22、 i+) var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); /加載程序集 asmb.CreateInstance("TestClass"); watch1.Stop(); label3.Text = "assembly.CreateInstance(string typeName)時間:" + watch1.ElapsedMilliseconds + "毫秒" watch1.Reset(); watch1.Start(); for (int i

23、= 0; i < num; i+) var asmb = Assembly.LoadFrom("ReflectiveClassLibrary.dll"); Type type = asmb.GetType("ReflectiveClassLibrary.TestClass"); object obj = type.InvokeMember(null, BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null); watch1.Stop(); label4.Text = "Type.InvokeMemb

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論