高效C 編碼優化

2021-08-29 01:28:16 字數 3149 閱讀 4349

***

1.foreach vs for 語句

foreach 要比for具有更好的執行效率

foreach的平均花費時間只有for的30%.通過測試結果在for和foreach都可以使用的情況下,我們推薦使用效率更高的foreach

另外,用for寫入資料時間大約是讀取資料時間的10倍左右.

2.避免使用arraylist

arraylist的效能低下任何物件新增到arraylist中都要封箱為system.object,從arraylist中取出資料都要拆箱回實際的型別

泛型集合類的高效能,泛型集合是強型別的

3.使用hashtable字典集合

當存放少量資料時建議使用hashtable取代像stringdictionary,namevaluecollection, hybridcollection這樣的字典集合
4.為字串容器宣告常量

為字串容器宣告常量,不要直接把字串封裝在雙引號」」中,避免字串物件不斷在記憶體中建立和釋放.提高字串物件的訪問效率.

//避免

myobject obj = new myobject();

obj.status = 「active」;

//推薦

const string c = 「acive」;

myobject obj = new myobject();

obj.status = c;

5.使用string.compare()字串比較

不要使用uppercase或lowercase轉換字串的大小寫,再進行比較

使用string.compare()可忽略字串大小寫進行比較

string strtemp = 「active」;

if(string.compare(strtemp,」active」,true)==0)

6.使用stringbuilder字串拼接

1.string類物件是不可變的(唯讀),對於string物件的重新賦值,本質是重新建立乙個新的string物件並賦予新值給該物件.

2.system.text.stringbuilder 維護乙個長度等於capacity的字串(可以看作字元陣列),當capacity長度的字串不足以容納結果字串時,stringbuilder開闢新的長度為經過上面的規則計算好的capacity的記憶體區域,將原字串複製到新的記憶體區域再進行操作,原字串區域交給gc**。因此這裡也涉及到記憶體的分配與**,使用stringbuilder時最好估算一下所需容量,用這個容量初始化capacity,提高效能。stringbuilder不能保證所有例項成員都是執行緒安全的,儘管在型別定義中加入了很多執行緒安全的控制,如果要確保其執行緒安全,須手工實現執行緒同步機制。

7.xpathdocument讀取xml檔案

如果只是讀取xml物件的資料,那麼用唯讀的xpathdocument代替xmldocument,可以提高效能
8.避免在迴圈體裡宣告變數,應該在迴圈體外宣告變數,在迴圈體內初始化變數

//避免

for(int i=0;i<10;i++)

//推薦

someclass obj = null;

for(int i=0; i<10; i++)

9.捕獲指定的異常

捕獲異常時,應使用具體的異常類進行捕獲,並按照異常所捕獲得範圍按照由小到大的順序進行定義不要使用通用的system.exception

private void find(object obj)

catch(argumentnullexception ane)

catch(argumentexception ae)

catch(systemexception se)

catch(exception e)

}不要使用exception控制流程,捕獲異常對效能的損耗是眾所周知的.因此最好能夠避免異常的發生

10.使用using和try/finally清理資源

.net 平台在記憶體管理方面提供了gc(garbage collection),負責自動釋放託管資源和記憶體**的工作,但它無法對非託管資源進行釋放,這時我們必須自己提供方法來釋放物件內分配的非託管資源

使用非託管資源的型別必須實現idisposable介面的dispose方法來精確的釋放資料

當使用帶有dispose方法的型別化資源時,應在使用完畢時呼叫dispose方法,及時釋放掉不用的資源.

使用using或try/finally能更好的保證dispose方法被及時的呼叫

11.避免濫用反射

反射是比較浪費效能的操作,應避免濫用反射

影響效能的原因:

當使用反射來呼叫型別或觸發方法,訪問字段屬性時,clr需要做更多的工作:校驗引數,檢查許可權等.

當編寫乙個動態構造型別(晚繫結)的應用時,可採取以下方式進行替換

通過類的繼承關係

通過介面實現

通過委託實現

12.避免裝箱操作

使用值型別的tostring方法避免裝箱操作

原因:數字和字串拼接的時候,因為資料型別不同,數字通過裝箱操作轉換為引用型別後才能與字串進行拼接.

//建議

採用 server.transfer 語法,在頁面中使用該方法可避免不必要的客戶端重定向(response.redirect)。

int32.tryparse()

型別轉化int32.tryparse()優於int32.parse()優於convert.toint32()

convert.toint32 會把最終的解析工作**給int32.parse

int32.parse 會把最終的解析工作**給number.parseint32

int32.tryparse 會把最終的解析工作**給number.tryparseint32

高效C 編碼優化

條條大路通羅馬,一種需求,有很多種編碼方式可以實現,如果在實現的基礎上進行優化,豈不是更好。1 foreach 比for語句具有更好的執行效率。foreach的平均時間只有for的30 在兩者都可以使用的情況下,建議使用foreach,另外,用for寫入資料所花的時間大約是讀取資料時間的10倍。2 ...

高效面試之理解編碼

一.補碼 1.為什麼要使用原碼,反碼,補碼 1 負數二進位制怎麼表示?答 在原碼中,高位為1就表示負數 2 計算機如何實現減法?1 1 答 對於計算機,邏輯運算應該設計的簡單,1 1可以表示為1 1 故沒有減法,用加法實現減法。1 1 1 1 00000001 原 10000001 原 100000...

高效併發之鎖優化

前面討論執行緒間互斥同步的時候,提到了互斥同步對效能最大的影響是阻塞的實現,掛起執行緒和恢復執行緒操作都需要轉入核心態中完成,這些操作給系統的併發效能帶來了很大的壓力。共享資料的鎖定狀態只會持續很短一段時間,為了這段時間去掛起和恢復執行緒並不值得。如果物理機器有乙個以上的處理器,能讓兩個或以上的執行...