代码之家  ›  专栏  ›  技术社区  ›  Cine

Datatable添加新列和值速度问题

  •  0
  • Cine  · 技术社区  · 15 年前

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

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

      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倍),我不想花那么多时间来更改它,这也是因为原始表来自第三方组件。

    测试设置中的跟踪数据(请注意,没有任何事件侦听器):

    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 回复  |  直到 15 年前
        1
  •  1
  •   SLaks    15 年前

    打电话给 BeginLoadData() method 在桌子上。

    而且,你应该 从未 Type.GetType(string) .
    相反,写 typeof(string) . 单凭这一点,它的速度就会加快一个数量级。(呼叫 Type.GetType