VB.NET2005です。
コンボボックスのコレクションとして
・商品コード(Integer)
・商品名(String)
・属性項目(String)
・種類(Integer)
の4項目で1万件分のデータを追加しようとしていますが、
DataTable使用で8秒かかってしまっています。
そこで構造体配列(1万件固定)に変更すると5秒になりました。
遅くとも3秒までにしたいのですが、他によい方法はありますか?
教えて下さい。
何卒よろしくお願い申し上げます。
> DataTable使用で8秒かかってしまっています。
DataTable 法を試してみましたが、当方環境(HP Compaq 2710p)では
3秒強で完了しました。
開始 - 00:00:00
完了 - 00:00:03.1779884
--------------------------------------------------------------------
Private ds As DataSet
Private ReadOnly DummyDataCount As Integer = 10000
Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
ds = New DataSet()
Dim tbl As DataTable = ds.Tables.Add("サンプル")
Dim cols As DataColumnCollection = tbl.Columns
cols.Add("商品コード", GetType(Integer))
cols.Add("商品名", GetType(String))
cols.Add("属性項目", GetType(String))
cols.Add("種類", GetType(Integer))
tbl.PrimaryKey = New DataColumn() {cols("商品コード")}
BindingSource1.DataSource = ds
BindingSource1.DataMember = "サンプル"
ComboBox1.DataSource = BindingSource1
ComboBox1.ValueMember = "商品コード"
ComboBox1.DisplayMember = "商品名"
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Dim sw As New Stopwatch()
Trace.WriteLine("開始 - " & sw.Elapsed.ToString())
sw.Start()
BindingSource1.RaiseListChangedEvents = False
BindingSource1.SuspendBinding()
Dim r As New Random()
With ds.Tables("サンプル").Rows
For n As Integer = 1 To DummyDataCount
.Add(n, "商品" & CStr(n), "属性" & CStr(r.Next()), r.Next(256))
Next
End With
BindingSource1.RaiseListChangedEvents = True
BindingSource1.ResumeBinding()
sw.Stop()
Trace.WriteLine("完了 - " & sw.Elapsed.ToString())
End Sub
仕様的にコンボボックスに1万件もセットするって
どうかと思います。
検索画面などに変更するのも考慮した方がいい気がします。
お返事ありがとうございました。
DataTableよりも構造体配列の方がやはり速いようでした。
またループ内のどの処理にどれだけかかっているかを具体的に
分析しましたら、配列へのセットだけでなく、
配列セット前の入力チェック等にも意外とかかっていました。
このチェックを最低限にしセット項目も最小限にとどめるなど
処理の最適化を行うことで3秒程度になりました。
お手数をお掛けして申し訳ございませんでした。
ありがとうございました。
ツイート | ![]() |