《軟體開發效能優化系列》之型別系統

2022-04-09 23:59:00 字數 1498 閱讀 6559

clr保證所有物件在訪問前已初始化,其做法是將分配的記憶體清零。因此,不需要將變數重新初始化為0、false或null。

需要注意的是:方法中的區域性變數不是從堆而是從棧上分配,所以c#不會做清零工作。如果使用了未賦值的區域性變數,編譯期間即會報警。不要因為有這個印象而對所有類的成員變數也做賦值動作,兩者的機理完全不同!

(1)、 以引用方式傳遞值型別引數

值型別從呼叫棧分配,引用型別從託管堆分配。當值型別用作方法引數時,缺省會進行引數值複製,這抵消了值型別分配效率上的優勢。作為一項基本技巧,以引用方式傳遞值型別引數可以提高效能。

private

void usedatebyref(ref datetime dt)

public

void foo()

(2)、 為 valuetype 提供 equals 方法

.net 預設實現的 valuetype.equals 方法使用了反射技術,依靠反射來獲得所有成員變數值做比較,這個效率極低。如果我們編寫的值物件其 equals 方法要被用到(例如將值物件放到 hashtable 中),那麼就應該過載 equals 方法。

public

struct rectangle

private

bool equals (rectangle rect)

}

(3)、避免裝箱和拆箱 

c#可以在值型別和引用型別之間自動轉換,方法是裝箱和拆箱。裝箱需要從堆上分配物件並拷貝值,有一定效能消耗。如果這一過程發生在迴圈中或是作為底層方法被頻繁呼叫,則應該警惕累計的效應。

一種經常的情形出現在使用集合型別時。例如:

arraylist al = new arraylist(); 

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

int f = ( int )al[ 0 ]; // the element is unboxed

解決這個問題的方法是使用.net2.0支援的泛型集合型別。

《軟體開發效能優化系列》之死鎖

死鎖是由兩個相互阻塞的執行緒組成,它們互相等待對方完成,一般死鎖情況下兩個資料庫事務之間存在著相反的操作。sqlserver中死鎖監視器定時檢查死鎖,如果發現死鎖,將選擇其中回滾消耗最小的任務,這時候發生1025資料庫錯誤。可以通過啟用sqlserver2005快照模式,避免一些讀 寫的逆向阻塞造成...

《軟體開發效能優化系列》之Sql效能優化 一

對於一般簡單查詢,資料庫能自動引數啊以重用計畫快取,如 select from table where id 1 select from table where id 4 在sqlserver內部能自動引數化這個查詢,select from table where id 1 但是一旦sql語句中帶有...

《軟體開發效能優化系列》之String操作

string是不變類,使用 操作連線字串會導致建立乙個新的字串。如果字串連線次數不是固定的,例如在乙個迴圈操作中,則應該使用stringbuilder類來做字串連線工作。因為stringbuilder內部有乙個stringbuffer,連線字元操作不會每次分配新的字串空間。只有當連線後的字串超出bu...