C#程式效能最佳化

來源:互聯網
上載者:User

標籤:style   class   blog   code   get   使用   

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

1.記憶體回收

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

1.1避免在迴圈中建立對象

高效的做法是將對象的建立置於迴圈之外。但是如果每一次迴圈需要執行個體化一個對象加入到對象列表中這個就避免不了在迴圈內部建立對象,如果把這個對象建立在對象之外那麼會導致迴圈多次加入到列表中的對象是迴圈最後一次對象的資料了。

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

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

2.String操作

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

2.1. 我們認識一下String

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

<span style="font-family:FangSong_GB2312;">StringBuilder sb = new StringBuilder(256 );for ( int i = 0 ; i < Results.Count; i ++ ){sb.Append (Results[i]);}</span>

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.效能最佳化實踐,效能最佳化方法主要有:最佳化系統結構、使用緩衝、延後執行、最佳化演算法和非同步/多線程編程


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.