Datatable添加新列和值速度问题

时间:2010-05-24 02:41:18

标签: .net optimization datatable

我的数据表有一些速度问题。在这种特殊情况下,我使用它作为数据的持有者,它从未在GUI或任何其他实际使用任何花哨功能的场景中使用。

在我的速度跟踪中,当我的数据库是~40k行时,这个特定的构造函数显示为时间的重度用户。主要用户是DataTable的set_Item。

  protected myclass(DataTable dataTable, DataColumn idColumn)
  {
     this.dataTable = dataTable;
     IdColumn = idColumn ?? this.dataTable.Columns.Add(string.Format("SYS_{0}_SYS", Guid.NewGuid()), Type.GetType("System.Int32"));

     JobIdColumn = this.dataTable.Columns.Add(string.Format("SYS_{0}_SYS", Guid.NewGuid()), Type.GetType("System.Int32"));
     IsNewColumn = this.dataTable.Columns.Add(string.Format("SYS_{0}_SYS", Guid.NewGuid()), Type.GetType("System.Int32"));

     int id = 1;
     foreach (DataRow r in this.dataTable.Rows)
     {
        r[JobIdColumn] = id++;
        r[IsNewColumn] = (r[IdColumn] == null || r[IdColumn].ToString() == string.Empty) ? 1 : 0;
     }

深入研究跟踪,事实证明set_Item调用EndEdit,这将我的想法带到了DataTable的事务支持,我在我的场景中没有使用它。

所以我的解决办法就是在所有行上打开编辑,再也不要关闭它们。

     _dt.BeginLoadData();
     foreach (DataRow row in _dt.Rows)
         row.BeginEdit();

有更好的解决方案吗?这感觉太像一个巨大的黑客,最终会来咬我。

您可能会建议我根本不使用DataTable,但我已经考虑过并拒绝了它,因为重新实现自定义类需要付出很多努力。它是一个数据表的主要原因是它是古代代码(.net 1.1时间),我不想花那么多时间来改变它,也是因为原始表来自第三方组件。

来自测试设置的跟踪数据(注意,没有任何事件监听器):

不打开编辑100k行(和9列):

RaiseRowChanging (30.68%) 1204 msec 100k calls
 - get_Item (6.54%) 277msec 900k calls
 - UpdatingCurrent (3.09%) 130msec 900k calls

打开编辑100k行(和9列):

RaiseRowChanging (3.68%) 98 msec 100k calls
 - ...

1 个答案:

答案 0 :(得分:1)

拨打桌面上的BeginLoadData() method

此外,您应该从不致电Type.GetType(string) 相反,写下typeof(string)。仅此一点就可以使它快一个数量级。 (调用Type.GetType将使用反射来搜索所有已加载的程序集以查找具有该名称的类型)