1. 程式人生 > >C#程式效能優化

C#程式效能優化

程式中我們每一絲動作都會加大程式執行的負擔,當剛開始學習程式的時候常常不會去考慮程式執行的效率,大多數情況是為了實現功能,只要功能達到我想要的那麼就算是達成了此專案標。當大部分功能的編碼實現對我們來說都不是大的問題的時候,我們要提升就要考慮怎樣把程式寫的更加規範更加高效。怎樣寫的高效,我們不說整體架構的設計,僅僅分享一下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.效能優化實踐,效能優化方法主要有:優化系統結構、使用快取、延後執行、優化演算法和非同步/多執行緒程式設計

相關推薦

C#程式效能優化

程式中我們每一絲動作都會加大程式執行的負擔,當剛開始學習程式的時候常常不會去考慮程式執行的效率,大多數情況是為了實現功能,只要功能達到我想要的那麼就算是達成了此專案標。當大部分功能的編碼實現對我們來說都不是大的問題的時候,我們要提升就要考慮怎樣把程式寫的更加規範更加高效。怎

c++ 程式效能優化(一)

最近在看《c++ 效能優化指南》書籍,從書中學習到了不少c++ 程式優化的點,平時程式碼中一定要注意這些坑,在此記錄下來。本篇幅主要是講下字串處理效能的優化。 一.下面來看一個簡單的例子,我們平時 寫程式碼 不注意的時候,最有可能寫出的是如下所示的第一種 remove_ct

記憶體池的設計和實現 -- C++應用程式效能優化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++ 行內函數 摘自 C++ 應用程式效能優化

行內函數 在C++語言的設計中,行內函數的引入可以說完全是為了效能的考慮。因此在編寫對效能要求比較高的C++程式時,非常有必要仔細考量行內函數的使用。 所謂"內聯",即將被呼叫函式的函式體程式碼直接地整個插入到該函式被呼叫處,而不是通過call語句進行。當然,編譯器在真正進行"內聯"時,因為考慮到被行內函數

記憶體池的設計和實現 -- 《C++應用程式效能優化

本書主要針對的是 C++ 程式的效能優化,深入介紹 C++ 程式效能優化的方法和例項。全書由 4 個篇組成,第 1 篇介紹 C++ 語言的物件模型,該篇是優化 C++ 程式的基礎;第 2 篇主要針對如何優化 C++ 程式的記憶體使用;第 3 篇介紹如何優化程式的啟動效能;第 4 篇介紹了三類效能優化工具,即

python程式效能優化

最近工作中有個任務,就是優化一個模型的實時性。從有到無,主要完成了以下內容。 0.模型的邏輯 1.演算法邏輯 2.程式碼重構 3.程式的效能優化,包括編譯、多執行緒、多程序、numba 4.語言 numba包,經測試,比較適用於陣列、矩陣等數值計算,其他的型別操作,容易報錯。

微信小程式效能優化方案——讓你的小程式如此絲滑

微信小程式如果想要優化效能,有關鍵性的兩點: 提高載入效能 提高渲染效能 接下來分別來介紹一下: 提高載入效能 首先,問一個問題,當用戶點選小程式後發生了什麼? 上圖中的三個狀態,我們經常遇到,它們分別對應小程式的下面三個狀態: 有三個點的白屏(左側): 下載程式碼

C程式碼效能優化總結

轉自:https://blog.csdn.net/chenyq991/article/details/79047741 1、優化程式碼框架 個人覺得程式碼架構對效能的影響至關重要,就好骨架之於人,所以我把這個放在第一點。舉個簡單的例子: 優化前: void main() { whi

C# http 效能優化500毫秒到 60 毫秒

偶然發現 C# 的 HttpRequest 要比 Chrome 請求同一Url 慢好多。C# HttpRequest 要500毫秒 而Chrome 只需要 39ms。 作為有責任感的 碼農。這個 必須優化。。 後來 整理 各種方法做了優化  HttpWebRequest request

微信小程式效能優化技巧

摘要: 如果小程式不夠快,還要它幹嘛? 原文:微信小程式效能優化方案——讓你的小程式如此絲滑 作者:杜俊成要好好學習 Fundebug經授權轉載,版權歸原作者所有。 微信小程式如果想要優化效能,有關鍵性的兩點: 提高載入效能 提高渲染效能 接下來分別來介紹一下: 提高載

Java程式效能優化—十年碼農總結的程式設計小技巧

程式的效能受程式碼質量的直接影響。在本文中,主要介紹一些程式碼編寫的小技巧和慣例,這些技巧有助於在程式碼級別上提升系統性能。 1、慎用異常 在Java軟體開發中,經常使用 try-catch 進行錯誤捕獲,但是,try-catch 語句對系統性能而言是非常糟糕的。雖然在一次 try-catc

【Java程式效能優化 第一版】第四章

                                 第4章  並行程式開發與優化    本章主要介紹基於Java的並行程式開發及其優化方法。對於多核CPU,傳統的序列程式已經無法很好發揮CPU的效能。此時,就需要通過使用多執行緒並行的方式挖掘CPU的潛能。本章

最新Java程式效能優化,讓你的Java程式更快、更穩定

Eureka  Eureka(原來以為是縮寫,原來就是一個單詞,翻譯為:我發現了,我找到了!0.0)是Netflix開源的一款提供服務註冊和發現的產品,它提供了完整的Service Registry和Service Discovery實現。也是springcloud體系中最重要最核心的

Java程式效能優化 讀書筆記(六)設計模式:觀察者模式

一、觀察者模式 觀察者模式定義了物件間的一種一對多依賴關係,使得每當一個物件改變狀態,則所有依賴於它的物件都會得到通知並被自動更新。它將觀察者和被觀察者的物件分離開。提高了應用程式的可維護性和重用性。觀察者模式又稱為釋出/訂閱(Publish/Subscribe)模式。 觀

《Java程式效能優化》學習筆記之HashMap和LinkedHashMap

1.HashMap沒啥可說的 2.LinkedHashMap是HashMap的子類,在HashMap的基礎上加了一個連結串列,每次put元素都會往連結串列上加節點。 public LinkedHashMap(int initialCapacity, float loadFa

程式效能優化探討(5)——快取記憶體、儲存器山與矩陣乘法優化

        這一節內容將綜合(3)和(4),討論快取記憶體相關的程式優化。 一、牛B完了的儲存器山         一個程式從儲存系統中讀資料的速率被稱為讀吞吐量或讀頻寬。如果一個程式在s秒的時間段內讀n個位元組,那麼讀吞吐量就是n/s,一般用MB/s作為單位。  

java程式效能優化讀書筆記-垃圾回收

衡量系統性能的點 執行速度:即響應時間 記憶體分配:記憶體分配是否合理,是否過多消耗記憶體或者存在記憶體洩露 啟動時間:程式從啟動到正常處理業務需要的時間 負載承受能力:當系統壓力上升,系統執行速度和響應時間上升曲線是否平緩 系統調優層次 系統設計調優 程式碼調優

程式效能優化探討(3)——儲存器層次結構與快取記憶體

        連外行都大概清楚,目前硬體速度的瓶頸在硬碟而不是CPU。為了有效的克服不同器件之間的速度差,從CPU到硬碟引入了多級快取機制。由於快取影響程式讀取速度,因此是實現優化時必須考慮的內容。 一、儲存器層次結構         快取的思想可能存在於任何有速度差的

程式效能優化總結

歷史總結: 小程式倒計時深究 小程式實戰踩坑之B2B商城專案總結 初試小刀自我簡歷小程式 啟動載入優化 在小程式啟動時,微信會在背後完成幾項工作:下載小程式程式碼包、載入小程式程式碼包、初始化小程式首頁。 初始化小程式環境是微信環境做的工作,我們只需要控制程式碼包大小,和通過一些相關的

50個PHP程式效能優化的方法

1、 用單引號代替雙引號來包含字串,這樣做會更快一些。因為 PHP 會在雙引號包圍的 字串中搜尋變數,單引號則不會,注意:只有 echo 能這麼做,它是一種可以把多個字元 串當作引數的“函式”(譯註:PHP 手冊中說 echo 是語言結構,不是真正的函式,故把函式 加上了雙引號)。 2、