我们最近经历了具有大列数(~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)操作?当然,数据表已经以某种方式索引其列集合了吗?