2

インポート エクスポート テスト用のモック データベースを作成しています (IO 操作をテストするだけでなく、複雑なデータ構造をデータベースに読み書きするアルゴリズムの)、DataSet を使用してモック テーブルを格納するかどうかを決定しようとしています (テーブルごと)。 name) の偽データベース、または Dictionary()

名前でデータテーブルを取得するという点では、dataset.Tables["TableName"] または dictionary<"TableName"> (Dictionary() から) からより良いパフォーマンスが期待できますか?

4

2 に答える 2

7

実際には、辞書ロジック(ハッチ、バケットなど)を実行する際の固有の複雑さのために、線形検索よりも低速Dictionary<,>になることがよくあります。私のテストでは、カットオフ(より速くなり始める)は多くの場合約150要素です。また、一般的にテーブルの数は150よりはるかに少ないので、パフォーマンスの線形リストに満足しています。Dictionary<,>

(これは、「使用しないことを意味するわけではありませんDictionary<T>。これは、パフォーマンスがこの特定のユースケースの主な理由ではない可能性があることを意味します。一意のキーの適用とfoo ["bar"]モデルがそうである可能性があります)

これの一部は、ハッシュの取得の複雑さによるものです-特にGetHashCode()forstringは比較的高価です(ただし、int.GetHashCode()目がくらむほど高速です; -p)。

実際には、ほとんどの小さなデータセットでは、2つの違いに気付くことはありません。大きなデータがある場合は、明らかにその計画を立て、それに応じてコーディングする必要があります。

Dictionary<,>aとaのようなもののその他の違いは、List<>一意性のようなものです。aはDictionary<,>キーを複製できません(ただし、Lookup<,>.NET 3.5のaは複製できます)。

于 2008-12-10T09:20:22.677 に答える
4

DataSet.Tables は、ArrayList を使用して内部的に実装されています。名前でテーブルを検索するには、リスト内のテーブルの線形検索と多くのキャストが必要です。したがって、ハッシュベースでジェネリックなディクショナリを使用すると、ほぼ確実に高速になります。(ただし、大きな違いを生むには、多くのテーブルやアクセスが必要です。)

于 2008-12-10T05:29:27.917 に答える