我的数据表有速度问题。在这种特殊情况下,我使用它作为数据的持有者,它从来没有在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
- ...