C# DataSet效能最佳實踐

衣舞晨風發表於2015-11-07

C# 效能優化細節

1、使用ItemArray實現對DataRow的批量賦值

  • 在對DataRow的所有欄位賦值時,使用欄位名進行逐列賦值效率較低。這時應儘量使用批量欄位賦值。可以使用ItemArray或rows.Add方法:
    / ds是資料集(DataSet)物件
    DataTable dt = ds.Tables[0];
    DataRow row = dt.NewRow();
    row.ItemArray = new object[] { value1, value2, …, valuen };
    // ds是資料集(DataSet)物件
    DataTable dt = ds.Tables[0];
    dt.Rows.Add(value1, value2, …, valuen);
    //應避免做大量連續的單列賦值,如下:
    DataTable dt = ds.Tables[0];
    DataRow row = dt.NewRow();
    row["col1"] = value1;
    row["col2"] = value2;
    …
    row["coln"] = valuen;

2、合理使用DataTable的平行計算

  • DataTable 內建的平行計算可以充分利用電腦的每個CPU,起到優化效率的作用。
    IEnumerable<DataRow> FindRows() //查詢所有數量小於0的分錄
    {
        DataTable dt = ItemDataTable;
        ……
        return dt.Select(“Quantity<0”); //未使用平行計算
    }
    IEnumerable<DataRow> FindRows() //查詢所有數量小於0的分錄
    {
        DataTable dt = ItemDataTable;
        ……
        int index = dt.Columns.IndexOf("Quantity");
        return dt.AsEnumerable().AsParallel().Where(dr => (decimal)dr[index] < 0); //使用平行計算:
    }

  • 根據實驗,當對DataTable的行選擇時平行計算優於Select和迴圈過濾等方式;當進行行遍歷時效能類似。

3、使用ImportRow實現向同結構DataTable合併

  • 使用Merge方法可以很方便的實現DataTable的合併,但Merge的效率卻非常差程式碼;示例如下:
    DataTable[] srcTables = ... ;
    foreach(DataTable src in srcTables )
    {	
    	dest.Merge( src ) ;
    }
  • ImportRow也可以實現DataTable的合併操作,效能相比Merge要高很多。程式碼示例如下:
    DataTable[] srcTables = ... ;
    foreach(DataTable src in srcTables )
    {
      foreach(DataRow row in src.Rows)
      {
         dest.ImportRow( row ) ;      
      }
    }

4、待續



相關文章