2

我们最近经历了具有大量列数(~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) 操作吗?数据表肯定以某种方式索引了它的列集合吗?

4

0 回答 0