最近、列数が多い(〜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)操作であるべきではありませんか?確かに、データテーブルはその列コレクションに何らかの方法でインデックスを付けていますか?