コンボボックスに1万件のコレクションを高速に追加するには?

解決


モモ  2009-01-04 05:34:16  No: 145592

VB.NET2005です。
コンボボックスのコレクションとして
・商品コード(Integer)
・商品名(String)
・属性項目(String)
・種類(Integer)
の4項目で1万件分のデータを追加しようとしていますが、
DataTable使用で8秒かかってしまっています。
そこで構造体配列(1万件固定)に変更すると5秒になりました。
遅くとも3秒までにしたいのですが、他によい方法はありますか?
教えて下さい。
何卒よろしくお願い申し上げます。


魔界の仮面弁士  2009-01-04 22:06:14  No: 145593

> 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


やじゅ  2009-01-05 21:12:59  No: 145594

仕様的にコンボボックスに1万件もセットするって
どうかと思います。
検索画面などに変更するのも考慮した方がいい気がします。


モモ  2009-01-06 18:57:45  No: 145595

お返事ありがとうございました。
DataTableよりも構造体配列の方がやはり速いようでした。
またループ内のどの処理にどれだけかかっているかを具体的に
分析しましたら、配列へのセットだけでなく、
配列セット前の入力チェック等にも意外とかかっていました。
このチェックを最低限にしセット項目も最小限にとどめるなど
処理の最適化を行うことで3秒程度になりました。
お手数をお掛けして申し訳ございませんでした。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加