標籤:style http color 使用 ar strong 資料 sp 問題
當剛開始學習程式的時候常常不會去考慮程式啟動並執行效率,大多數情況是為了實現功能,只要功能達到我想 要的那麼就算是達成了此項目標。當大部分功能的編碼實現對我們來說都不是大的問題的時候,我們要提升就要考慮怎樣把程式寫的更加規範更加高效。怎樣寫的高效,我們不說整體架構的設計,僅僅分享一下C#自身程式中的一些會影響效能的點。建議觀看C#入門基礎01教程。
1、記憶體回收
.NET Framework記憶體回收的成本高,每次回收垃圾的時候調用最久未被使用的演算法,找出最久未被使用的對象然後把這個對象分配的記憶體進行回收。進行這樣的演算法會非常消耗電腦的運算能力,所以在C#程式編碼中避免建立不必要的對象。
1.1 避免在迴圈中建立對象
高效的做法是將對象的建立置於迴圈之外。但是如果每一次迴圈需要執行個體化一個對象加入到對象列表中這個就避免不了在迴圈內部建立對象,如果把這個對象建立在對象之外那麼會導致迴圈多次加入到列表中的對象是迴圈最後一次對象的資料了。
1.2 在需要的地方才建立對象
如果對象只有在某些分支邏輯中才會被使用到,那麼把具體建立對象的操作放在邏輯分支中。盡量避免在函數之前建立出函數所要使用到的所有對象。
2、String操作
String字串操作,我們多次使用到的。所以在操作String的時候採用不高效的處理會一定程度上影響到程式的執行效率。
2.1 我們認識一下String
String 是不變類,如果我們使用"+"來連接字串,會導致建立一個新的空間來儲存串連後的字串,在多次迴圈中使用"+"會導致記憶體迴圈被開闢。這個時候應該使 用StringBuilder.StringBuilder內部有一個StringBuffer,串連操作不會每一次都分配新的字串空間。
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 效能最佳化實踐,效能最佳化方法主要有:最佳化系統結構、使用緩衝、延後執行、最佳化演算法和非同步/多線程編程
掌握IT技能瞭解更多程式設計語言教程知識,請登入e良師益友網學習教程知識。
最佳化自己的編寫出來的C#程式