1

私は定期的にLINQ拡張メソッドToDictionaryを使用していますが、パフォーマンスについて疑問に思っています。辞書の容量を定義するパラメーターはなく、10万項目以上のリストがある場合、これが問題になる可能性があります。

IList<int> list = new List<int> { 1, 2, ... , 1000000 };
IDictionary<int, string> dictionary = list.ToDictionary<int, string>(x => x, x => x.ToString("D7"));

実装は実際にlist.Countを取得し、それをディクショナリのコンストラクターに渡しますか?または、辞書のサイズ変更は十分に速いので、私はそれについて本当に心配する必要はありませんか?

4

5 に答える 5

2

実装は実際にlist.Countを取得し、それをディクショナリのコンストラクターに渡しますか?

これは実装の詳細であり、重要ではありません。

または、辞書のサイズ変更は十分に速いので、私はそれについて本当に心配する必要はありませんか?

まあ、わかりません。これが実際にアプリケーションのボトルネックであるかどうか、およびパフォーマンスが許容できるかどうかを知っているのはあなただけです。十分に高速かどうかを知りたい場合は、コードを記述して時間を計ってください。エリック・リッパートが言うことはありませんが、2頭の馬の速さを知りたい場合は、2頭の馬を競い合いますか、それともインターネット上のランダムな見知らぬ人にどちらが速いか尋ねますか?

とはいえ、これが現実的なアプリケーションのボトルネックであることを想像するのは非常に困難です。辞書に項目を追加することがアプリケーションのボトルネックである場合は、何か問題があります。

于 2012-05-29T14:43:18.657 に答える
2

実装は実際にlist.Countを取得し、それをディクショナリのコンストラクターに渡しますか?

いいえ。ILSpyによると、実装は基本的に次のとおりです。

Dictionary<TKey, TElement> dictionary = new Dictionary<TKey, TElement>(comparer);
foreach (TSource current in source)
{
    dictionary.Add(keySelector(current), elementSelector(current));
}
return dictionary;

コードのプロファイルを作成し、操作がボトルネックであると判断した場合ToDictionary、上記のコードに基づいて独自の関数を作成するのは簡単です。

于 2012-05-29T14:51:20.197 に答える
0

辞書のサイズ変更についてはわかりませんが、dotPeek.exeを使用して実装を確認すると、実装がリストの長さをとらないことがわかります。

コードが基本的に行うことは次のとおりです。

  • 新しい辞書を作成する
  • シーケンスを繰り返し、アイテムを追加します

これがボトルネックであることがわかった場合はToDictionaryWithCapacity、全体を繰り返さずに実際に長さを計算できるもので機能する独自の拡張メソッドを作成するのは簡単です。

Dictionary実装をスキャンしただけです。基本的に、いっぱいになり始めると、内部リストは、ほぼ2倍のプライムに近いサイズに変更されます。だからそれはあまり頻繁に起こらないはずです。

于 2012-05-29T14:45:16.817 に答える
0

ボトルネックのTBHになるとは思いません。また、実際の苦情や問題がある場合は、その時点でそれを調べて、改善できるかどうかを確認する必要があります。すべてを一度に変換する代わりに、ページングを実行できる可能性があります。

于 2012-05-29T14:47:09.297 に答える
0

実装は実際にlist.Countを取得し、それをディクショナリのコンストラクターに渡しますか?

そうではありません。これは、Count()を呼び出すとソースが列挙され、それをディクショナリに追加すると、もう一度ソースが列挙されるためです。ソースを2回列挙することはお勧めできません。たとえば、DataReaderでは失敗します。

または、辞書のサイズ変更は十分に速いので、私はそれについて本当に心配する必要はありませんか?

Dictionary.Resizeメソッドは、辞書を展開するために使用されます。新しいディクショナリを割り当て、既存のアイテムを新しいディクショナリにコピーします(Array.Copyを使用)。辞書のサイズは素数ステップで増加します。

これは最速の方法ではありませんが、サイズがわからない場合は十分に高速です。

于 2012-05-29T14:59:25.070 に答える