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

來源:互聯網
上載者:User

前段時間在cnblogs看到了一編文章《利用Emit減少反射的效能損失》原文(http://yok.cnblogs.com/archive/2005/11/03/267952.html);
在編寫一個資料處理組件時面對著這樣的問題,一個反射操作所消耗的時間雖然很短;但在對象和資料換轉之間存在著大量的反射操作,大量反射操下效率就有點令人擔心.為了驗證這一點於是採用動態編譯操作對象來避開反射操作.基於方便容易用我沒有選擇Emit,而採用CodeDom.兩者效能在整休上應該差別不大,因為通過CodeDom產生操作對象後緩衝起來,在後期調時直接從緩衝中擷取不需要重新編譯.
    通過CodeDom產生擷取資料到實體物件的代碼:
 public object CreateInstance()
 {
  return new Order();
 }
 public  void LoadInfo(object entity,System.Data.IDataReader pDataReader)
  {
    Order Item = (Order)entity;
    if(pDataReader["OrderID"] != DBNull.Value)
    {
     Item .OrderID= (Int32)pDataReader["OrderID"];
    }
    if(pDataReader["CustomerID"] != DBNull.Value)
    {
     Item .CustomerID= (String)pDataReader["CustomerID"];
    }
   ..............
  }
以上代碼在記憶體編譯後,其操作的效率和正常編寫代碼的效率差不多並不會有太大的差異.為了方便調用可以制定介面規範.
進行測試情況如下:
測試電腦配置
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微秒)。
    常用的工廠類經常通過反射來實現對象建立,可以利用這技術解決效率問題;這種技術雖然有它的好處,但實現起來有點麻煩,也消耗記憶體;所以可以根據實際情況來利用。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.