利用CodeDom來解決反射效能問題

2021-09-05 14:29:34 字數 1356 閱讀 3002

前段時間在cnblogs看到了一編文章《利用emit減少反射的效能損失》原文(

在編寫乙個資料處理元件時面對著這樣的問題,乙個反射操作所消耗的時間雖然很短;但在物件和資料換轉之間存在著大量的反射操作,大量反射操下效率就有點令人擔心.為了驗證這一點於是採用動態編譯操作物件來避開反射操作.基於方便容易用我沒有選擇emit,而採用codedom.兩者效能在整休上應該差別不大,因為通過codedom生成操作物件後快取起來,在後期調時直接從快取中獲取不需要重新編譯.

通過codedom生成獲取資料到實體物件的**:

public object createinstance()

public  void loadinfo(object entity,system.data.idatareader pdatareader)

if(pdatareader["customerid"] != dbnull.value)

..............

}以上**在記憶體編譯後,其操作的效率和正常編寫**的效率差不多並不會有太大的差異.為了方便呼叫可以制定介面規範.

進行測試情況如下:

測試電腦配置

p41.7,512記憶體

測試表結構.

2 orderid int 4 

0 customerid nchar 

0 employeeid int 

0 orderdate datetime 

0 requireddate datetime 

0 shippeddate datetime 

0 shipvia int 4 

0 freight money 8 

0 shipname nvarchar 

0 shipaddress nvarchar 

0 shipcity nvarchar 

0 shipregion nvarchar 

0 shippostalcode nvarchar 

1 shipcountry nvarchar 

830條記錄獲取測試情況,執行10次第一次和最後一次不要取其中8次的平均時間(檢視方便只保留3位小數).

0.040(秒) codedom對映到實體集合

0.123(秒) .net的反射功能的對映到實體集合(反射資訊已快取)

0.024(秒) 直接填充到dataset

從測試結果來看,運用codedom編譯操作物件代替反射操作的效率有明顯提高.前面的操作**也可以作改進,把鍵值用索引來代替效率和直接填充dataset會更接近(測試過用索引取值比用鍵值取值大概快2-3微秒)。

常用的工廠類經常通過反射來實現物件建立,可以利用這技術解決效率問題;這種技術雖然有它的好處,但實現起來有點麻煩,也消耗記憶體;所以可以根據實際情況來利用。

利用CodeDom和反射動態編譯並執行程式集

動態編譯,聽起來很酷,不是嗎?1.什麼是動態編譯 所謂動態編譯是由兩個字組成的 動態 編譯。很顯然,我們是想實現臨時地給出一段 然後將其編譯成程式集 可以是在記憶體中,也可以是輸出乙個真正的dll 2.什麼時候需要用到動態編譯?呃,這個問題有點難,簡單地說,就是要動態的時候啦。呵呵。我們有的時候需要...

利用搜尋樹來解決N皇后問題

資料結構裡面有個比較著名的八皇后問題,其解決方式倒有很多種,而搜尋樹又算是乙個人工智慧方面的入門的思想和手段了。下面就說下如何用搜尋樹來解決n皇后問題 以四皇后問題為例,如圖 在第零層,只有乙個根節點 在第一層,有四個節點符合符合條件,故根節點有四個子節點 在第二層,各個子節點又具有不同的節點,所以...

利用分治策略來解決最大子陣列問題

求解乙個陣列的最大子陣列,例如給定陣列b 0,n 1 就是找到滿足條件的一組i和j使得當i j時,有b j b i 的值達到最大。這裡我們很容易想到一種暴力求解的方法。從n個下標中任意選取兩個,就是n n 1 2中組合,來計算得到最大子陣列即可。此時這種演算法的時間複雜度為o n 2 但是若我們採用...