19

メモリにキャッシュされているDataTable/コレクションがあります。これをソースとして使用して、オートコンプリートテキストボックスの結果を生成します(もちろんAJAXを使用)。データをすばやく取得するためのさまざまなオプションを評価しています。データテーブルのコレクション/行のアイテム数は、10000から2,000,000まで変化する可能性があります。(流用されないように、今のところ決定が下されたと仮定すると、十分なRAMがあり、データベースクエリではなくキャッシュを使用します)

この処理のための追加のビジネスロジックがいくつかあります。priorityコレクションの列(int)に従って、オートコンプリートリストに優先順位を付ける必要があります。したがって、誰かが検索してMicro、で始まる単語/文の結果が20と表示された場合、結果Microの上位10項目を最も優先度の高いものとして選択します。(したがって、文字列値に関連付けられた優先度プロパティを持つ必要があります)。

コレクションアイテムはすでにアルファベット順にソートされています。

この場合の最良の解決策は何でしょうか。
1. DataTable.Select(を使用します。2。DataTable.Rows.Find(を使用します。3。foreach
またはfor でカスタムコレクションを使用して、その値を反復処理します。4.匿名のデリゲートまたはラムダ でジェネリックコレクションを使用します(どちらも同じパフォーマンスどうか?)

4

5 に答える 5

8

グラフは私のブログ エントリには掲載されていません。詳細については、http://msdn.microsoft.com/en-us/library/dd364983.aspxを参照してください。

それ以来、私が発見したもう 1 つのことは、大規模なデータ セットの場合、チェーン化された汎用辞書を使用すると非常にうまく機能することです。また、min や max などの集計操作に必要な並べ替え操作によって引き起こされる問題の多くを軽減するのにも役立ちます (DataTable.Computeまたはを使用LINQ)。

「連鎖汎用辞書」とは、Dictionary(Of String, Dictionary(Of String, Dictionary(Of Integer, List(Of DataRow))))各辞書のキーが検索語である、または同様の手法を意味します。

500x確かに、これはすべての状況で役立つわけではありませんが、このアプローチを実装するとパフォーマンスが向上するシナリオが少なくとも 1 つあります。

あなたの場合、最初の 1 ~ 5 文字、次にList(Of String). 最初の 1 ~ 5 文字の単語をリストに追加して、この辞書を一度作成する必要がありますが、その後は非常に高速に結果を得ることができます。

私は通常、このようなものをクラスにラップして、単語を簡単に追加するなどのことができるようにします。を使用してSortedList(Of String)、結果を自動的にソートすることもできます。このようにして、入力された最初の N 文字に一致する単語のリストをすばやく検索できます。

于 2009-06-11T15:57:19.910 に答える
4

私のautocompleteでは、最初にこのアプローチを試しましたlinq/lambdaが、パフォーマンスが少し遅くなりました。DataTable.Selectよりも高速なのでlinq、これを使用します。datatable.Selectとのパフォーマンスをまだ比較していませんdatatable.Find

于 2009-03-16T15:33:21.577 に答える
2

一日中推測することもできますが、これは巨大なコードではないので、それぞれを書いて相互にベンチマークしてみませんか?

public delegate void TestProcedure();

public TimeSpan Benchmark(TestProcedure tp)
{
    int testBatchSize = 5;
    List<TimeSpan> results = new List<TimeSpan>();
    for(int i = 0; i<testBatchSize; i++)
    {
        DateTime start = DateTime.Now;
        tp();
        results.Add(DateTime.Now - start);
    }
    return results.Min();
}
于 2009-03-09T15:33:41.887 に答える
1

以下のブログにあるように

http://blog.dotnetspeech.net/archive/2008/08/26/performance----datatable.select-vs-dictionary.aspx

DataTable.Rows.Find は、DataTable.Select よりもはるかに高速です。

于 2009-06-09T20:54:36.500 に答える