我们最近经历了具有大量列数(~100-200)的数据表的性能显着降低。经过一些调试,我认为滞后来自 datarow 的 set item 方法随着列数的增加而变慢。这是我们的基准测试,在循环中设置相同的行项:
Dim sw As New Stopwatch
Dim cnt = 10 ^ 6 - 1
Debug.Print("-- Row setter test for 10 column datatable --")
Dim dt As New DataTable
For i = 0 To 9
dt.Columns.Add("Column" & i.ToString)
Next
Dim row As DataRow = dt.Rows.Add
Dim col = dt.Columns(9)
sw.Restart()
For i = 0 To cnt
row.Item(col) = 3.14
Next
sw.Stop()
Debug.Print("RowSet time: " & sw.Elapsed.TotalSeconds.ToString)
Debug.Print("-- Row setter test for 100 column datatable --")
dt = New DataTable
For i = 0 To 99
dt.Columns.Add("Column" & i.ToString)
Next
row = dt.Rows.Add
col = dt.Columns(9)
sw.Restart()
For i = 0 To cnt
row.Item(col) = 3.14
Next
sw.Stop()
Debug.Print("RowSet time: " & sw.Elapsed.TotalSeconds.ToString)
...对于 10 列表输出 0.95 秒,对于 100 列表输出 5.8 秒 - 显着差异。使用其他重载集合方法的结果与列名和列索引相似。
我不明白这些结果。数据行项的获取/设置不应该是相对于总列数的 O(1) 操作吗?数据表肯定以某种方式索引了它的列集合吗?