2009-05-04 15 views
13

Sind enum Typen schneller/effizienter als Zeichenfolge Typen, wenn sie als Wörterbuchschlüssel verwendet?Was ist schneller/effizienter: Dictionary <string, object> oder Dictionary <enum,object>?

In der Tat, welcher Datentyp eignet sich am besten als Wörterbuchschlüssel und warum?

Betrachten Sie das folgende: HINWEIS: Nur 5 Eigenschaften der Einfachheit halber

struct MyKeys 
{ 
    public string Incomplete = "IN"; 
    public string Submitted = "SU"; 
    public string Processing="PR"; 
    public string Completed = "CO"; 
    public string Closed = "CL"; 
} 

und

enum MyKeys 
{ 
    Incomplete, 
    Submitted, 
    Processing, 
    Completed, 
    Closed 
} 

Welche der oben besser sein wird, wenn sie als Schlüssel in einem Wörterbuch verwendet!

+0

Hat C# ein Äquivalent von Java EnumMap? –

Antwort

13

Sicherlich ist die enum Version besser (wenn beide anwendbar sind und sinnvoll, natürlich). Nicht nur für die Leistung (es kann besser oder schlechter sein, siehe Rashacks sehr guten Kommentar) wie es kompilierte Zeit überprüft und sauberer Code führt.

Sie können das Vergleichsproblem umgehen, indem Sie Dictionary<int, object> verwenden und enum Schlüssel an int s senden oder einen benutzerdefinierten Vergleich angeben.

+9

Performance-weise ist es möglicherweise nicht wirklich wahr (überraschend) - http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx – Rashack

+1

Sie können immer Ihren eigenen Vergleicher angeben. Das ist kein Problem mit Dictionary oder Enum, aber der Vergleich –

5

Ich denke, Sie sollten mit der Korrektheit beginnen. Dies ist viel wichtiger als der minimale Unterschied zwischen den kleinen Leistungsunterschieden, die in Ihrem Programm auftreten können. In diesem Fall würde ich mich auf die richtige Darstellung Ihrer Typen konzentrieren (enum scheint die beste zu sein). Dann später Profil Ihrer Bewerbung und wenn es ein Problem gibt, dann und nur dann sollten Sie es beheben.

Code später schneller zu machen ist in der Regel ein einfacher Prozess. Nimm den Link, den skolima zur Verfügung gestellt hat. Wenn Sie enum gewählt hätten, wäre es eine ca. 10-minütige Korrektur gewesen, um ein potenzielles Leistungsproblem in Ihrer Anwendung zu entfernen. Ich möchte hier das Wort Potential betonen. Dies war definitiv ein Problem für NHibernate, aber ob es ein Problem für Ihr Programm wäre oder nicht, wäre allein durch die Verwendung bestimmt.

Auf der anderen Seite ist es schwieriger, Code später im Prozess korrekter zu machen. Bei einem Problem, das groß genug ist, werden Sie feststellen, dass Menschen Abhängigkeiten von den Nebenwirkungen des vorherigen schlechten Verhaltens nehmen. Dies kann den Code korrigieren, ohne andere Komponenten zu stören.

1

ist nicht anwendbar, aber ...

Beachten Sie, dass Aufzählungen compiled als constants sind die Umschichtung aller Baugruppen verursachen kann, die die Enum verweisen, wenn es geändert wird. (d. h. die Konstante wird zur Kompilierungszeit für alle Assemblys, die sie verwenden, fest codiert).

+0

würde also die String-Version, so dass ich nicht folgen Sie Ihrem Punkt. – Seabizkit

-1

Ich würde vermuten, dass die Enum-Version schneller ist. Unter der Haube verweist das Wörterbuch alles auf Hashcode. Meine Vermutung ist, dass es langsamer ist, den Hashcode für eine Zeichenfolge zu generieren. Dies ist jedoch wahrscheinlich vernachlässigbar langsamer und ist sicherlich schneller als alles andere wie ein String-Vergleich. Ich stimme den anderen Plakaten zu, die sagten, ein Enum sei sauberer.

Verwandte Themen