2009-09-16 14 views
30

C#リストは高速ですか?オブジェクトを扱うためにリストを使うことの良い点と悪い点は何ですか?C#リストの速度

リストを広範囲に使用すると、ソフトウェアの速度が低下しますか? C#のリストの代替案は何ですか?

リストに「オブジェクトが多すぎます」というオブジェクトの数はいくつですか?

+3

本当にあなたがそれらで何をしたいかによって異なります。 – LukeH

+10

"Fast"と "slow"は無関係です。関連性は「顧客のために十分に速い」と「顧客にとっては遅すぎる」です。あなたの最初の質問は「リストは十分に速いのですか?あなたはあなたの顧客が誰で、そのパフォーマンス要件が何であるかを知っている唯一の人なので、あなただけがその質問に答えることができます。意味のあるベンチマークを試し、あなたの慎重に述べた実際の顧客に焦点を当てた目標と比較することで答えます。 –

答えて

77

List<T>は、アイテムを保持するための補助配列を使用しています。

  • インデクサアクセス(すなわち/更新をフェッチ)O(1)
  • 尾から削除さO(1)
  • は、他の場所が必要ですから削除されます既存のアイテムがシフトされるので、O(n)は効果的です。
  • サイズ変更が必要な場合を除きO(1)に追加します。その場合はO(n)です。 (償却原価は、O(1)であるので、これは、バッファのサイズを倍増。)
  • 他の場所に追加するシフトダウンする既存のアイテムを必要とし、(N)Oので、効果的に
  • アイテムを見つけることは、N O(あります)ソートされている場合を除き、バイナリ検索ではO(log n)が返されます。

リストをかなり広く使用することは大丈夫です。リストの作成を開始するときに最終的なサイズが分かっている場合は、リサイズを避けるために容量を指定できるコンストラクタを使用することをお勧めします。それを超えて:あなたが関心があるならば、プロファイラを打ち破ってください...

+0

ブライアンはそれを修正しました - ありがとうブライアン:) –

+0

"最後に追加" O(1)の累積コストがあります –

+0

@トーマス:はい、これを言及します。 –

12

何に比べて?

  • List<T>を意味する場合、それは基本的に配列のラッパーです。インデックスによって読み書きするのが速く、は比較的遅く(最後に余分なスペースがあり、必要に応じてサイズが倍増するため)、最後から削除しますが、他の操作を行うには高価です終わり)
  • 配列はインデックスで速い再びですが、固定サイズ(何アペンド/削除しない)
  • Dictionary<,>などがキー

することにより、より良いアクセスリストは、本質的に遅いではありません提供します。特に、すべてのデータを常に見る必要があるか、インデックスでアクセスできることがわかっている場合は特にそうです。しかし、大きなリストの場合は、キーを使用して検索するほうが便利です(さらに便利です)。 .NETには様々な辞書実装があり、それぞれのコストとサイズが異なります。