2 Stimmen

Was lässt sich schneller auflösen, DataSet.Tables oder Dictionary<string, Tables>?

Ich erstelle eine Mock-Datenbank für Import-Export-Tests (der Algorithmus Lesen und Schreiben von komplexen Datenstrukturen in unsere Datenbank, nicht nur um IO-Operationen zu testen), und versuche zu entscheiden, ob ein DataSet verwenden, um die Mock-Tabellen (nach Tabellenname) in der Faux-Datenbank zu speichern, oder Dictionary()

In Bezug auf das Abrufen einer Datentabelle nach Name, würde ich erwarten, dass bessere Leistung von, dataset.Tables["TableName"] oder dictionary<"TableName"> (von Dictionary()?

7voto

Marc Gravell Punkte 970173

Eigentlich, Dictionary<,> ist oft Langsamer als eine lineare Suche, da die Logik des Wörterbuchs (Haches, Buckets usw.) sehr komplex ist. In meinen Tests wurde der Cutoff (wo Dictionary<,> beginnt, schneller zu werden) liegt oft bei 150 Elementen. Und da Sie in der Regel viel weniger Tabellen als 150 haben, würde ich mit einer linearen Liste für die Leistung zufrieden sein.

(was keineswegs bedeutet, dass man keine Dictionary<T> ; es bedeutet nur, dass Leistung ist vielleicht nicht der Hauptgrund für diesen speziellen Anwendungsfall; die eindeutige Schlüsselerzwingung und das foo["bar"]-Modell könnten es sein)

Dies liegt zum Teil an der Komplexität des Hashwerts - der GetHashCode() para string ist insbesondere relativ teuer (obwohl int.GetHashCode() ist rasend schnell ;-p).

In Wirklichkeit werden Sie bei den meisten kleinen Datensätzen nie einen Unterschied zwischen den beiden feststellen. Wenn Sie große Datenmengen haben, müssen Sie das natürlich einplanen und entsprechend codieren.

Weitere Unterschiede zwischen einer Dictionary<,> und so etwas wie ein List<> sind Dinge wie Einzigartigkeit: ein Dictionary<,> lässt keine doppelten Schlüssel zu (obwohl ein Lookup<,> in .NET 3.5 wird).

4voto

Eric Rosenberger Punkte 8837

DataSet.Tables ist intern mit einer ArrayList implementiert. Die Suche nach einer Tabelle nach Namen erfordert eine lineare Suche durch die Tabellen in der Liste und eine Menge Casting. Die Verwendung eines Dictionarys, das Hash-basiert und generisch ist, wäre also fast sicher schneller. (Allerdings bräuchte man eine große Anzahl von Tabellen und/oder eine große Anzahl von Zugriffen, damit es einen großen Unterschied macht.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X