2

最近、列数が多い(〜100-200)データテーブルのパフォーマンスが劇的に低下しました。いくつかのデバッグの後、列数が増えるにつれてデータ行のセットアイテムメソッドの速度が大幅に低下するため、ラグが発生すると思います。これがベンチマークであり、同じ行アイテムをループに設定します。

 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秒を出力します-大きな違いです。他のオーバーロードされたsetメソッドを使用した場合でも、列名と列インデックスによって結果は類似しています。

私はこれらの結果を理解していません。データ行アイテムの取得/設定は、合計列数に関してO(1)操作であるべきではありませんか?確かに、データテーブルはその列コレクションに何らかの方法でインデックスを付けていますか?

4

0 に答える 0