程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#程序性能優化

C#程序性能優化

編輯:C#入門知識

程序中我們每一絲動作都會加大程序運行的負擔,當剛開始學習程序的時候常常不會去考慮程序運行的效率,大多數情況是為了實現功能,只要功能達到我想要的那麼就算是達成了此項目標。當大部分功能的編碼實現對我們來說都不是大的問題的時候,我們要提升就要考慮怎樣把程序寫的更加規范更加高效。怎樣寫的高效,我們不說整體架構的設計,僅僅分享一下C#自身程序中的一些會影響性能的點。

1.垃圾回收

.NET Framework垃圾回收的成本高,每次回收垃圾的時候調用最久未被使用的算法,找出最久未被使用的對象然後把這個對象分配的內存進行回收。進行這樣的算法會非常消耗計算機的運算能力,所以在C#程序編碼中避免創建不必要的對象。

1.1避免在循環中創建對象

高效的做法是將對象的創建置於循環之外。但是如果每一次循環需要實例化一個對象加入到對象列表中這個就避免不了在循環內部創建對象,如果把這個對象創建在對象之外那麼會導致循環多次加入到列表中的對象是循環最後一次對象的數據了。

1.2在需要的地方才創建對象

如果對象只有在某些分支邏輯中才會被使用到,那麼把具體創建對象的操作放在邏輯分支中。盡量避免在函數之前創建出函數所要使用到的所有對象。

2.String操作

String字符串操作,我們多次使用到的。所以在操作String的時候采用不高效的處理會一定程度上影響到程序的執行效率。

2.1. 我們認識一下String

String是不變類,如果我們使用“+”來連接字符串,會導致創建一個新的空間來存儲連接後的字符串,在多次循環中使用“+”會導致內存循環被開辟。這個時候應該使用StringBuilder。StringBuilder內部有一個StringBuffer,連接操作不會每一次都分配新的字符串空間。

StringBuilder sb = new StringBuilder(256 );
for ( int i = 0 ; i < Results.Count; i ++ )
{
	sb.Append (Results[i]);
}

2.2.字符串String對象的Length與0比較最快的,其次是String.Empty或空串

C#在編譯時將程序集中聲明的所有字符串常量放到保留池中(intern pool),相同常量就不會重復分配了。

3.線程同步

3.1.線程同步粒度

C#線程同步通過Lock鎖定對象,我們可以鎖定一個方法,也可以鎖定方法中的某一段代碼。


通常情況下,應該減小同步的范圍,使系統獲得更好的性能。

3.2.同步策略

使用lock鎖定對象應該注意一下兩點

第一、避免使用鎖定Type,鎖定Type對象會影響進程中所有該鎖定對象都不能被他人使用,可能會導致無厘頭的錯誤,他的鎖定范圍太大了。

第二、避免使用鎖定this,程序中this表示當前對象,鎖定了改對象實例會影響其他使用到該示例的方法。

第三、建議,如果要同步,找到需要鎖定的最小范圍,然後實例化一個object對象,該對象只為了實現同步的目的。

4.CLR,C#的中間語言

CLR是C#語言被編譯之後的程序集,他是微軟設計的一款中間語言。

4.1.ValueType和ReferenceType

value類型是從棧上面分配的,引用類型是從堆上面分配的。當值類型作為方法參數時,默認會進行參數值賦值。所以使用引用類型傳遞數據要比值類型傳遞數據效率高。

4.2.避免裝箱和拆箱

簡單來說裝箱就是把值類型轉化為引用類型,拆箱就是把引用類型轉化為值類型。

5.異常處理

5.1 程序中該拋出異常的地方一定要跑出異常,使用try....catch...模塊包裹,這與性能無關,但是與程序排錯非常必要。
5.2 程序在拋出異常和捕獲異常會消耗比較大的操作,在程序編寫的情況下,通過完善程序邏輯盡量避免拋出不

6.反射的使用

他是將編譯期間的靜態綁定延遲到運行期間的動態綁定。反射帶來了很多設計的靈活性,但是與靜態綁定相比,動態綁定對性能有較大的影響。

1. Type.InvokeMember
  2. ContructorInfo.Invoke
  3. Activator.CreateInstance(Type)
  4. Activator.CreateInstance(assemblyName, typeName)
  5. Assembly.CreateInstance(typeName)
性能最快的是3,最慢的是4
建議:
1.如果可能,避免使用反射和動態綁定。
2.使用接口調用方式,將動態綁定改造為早期綁定
3.Activator.CreateInstance(Type)方式動態創建對象
4.使用typeof操作符替代GetType調用。

7.普遍規律

推薦使用as

8.性能優化策略

8.1.現在的存儲設備越來越便宜,所以,實踐中大部分的優化工作都是想方設法用空間換時間。
8.2.性能瓶頸診斷:使用專業的工具進行代碼性能的診斷,或者使用C#的StopWatch統計處程序代碼執行的時間消耗。
8.3.性能優化實踐,性能優化方法主要有:優化系統結構、使用緩存、延後執行、優化算法和異步/多線程編程


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved