2009-05-04 16 views
13

I tipi enum sono più veloci/più efficienti dei tipi quando utilizzati come chiavi del dizionario?Quale è più veloce/più efficiente: Dizionario <stringa, oggetto> o Dizionario <enum,object>?

IDictionary<string,object> or IDictionary<enum,object> 

In effetti, quale tipo di dati è più adatto come chiave del dizionario e perché?

Si consideri il seguente: NOTA: Solo 5 oggetti per semplicità

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

e

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

Quale di quanto sopra sarà meglio se usato come chiavi in ​​un dizionario!

+0

C# ha un equivalente di EnumMap di Java? –

risposta

13

Certamente la versione enum è migliore (quando entrambi sono applicabili e comprensibili, ovviamente). Non solo per le prestazioni (può essere migliore o peggiore, vedere l'ottimo commento di Rashack) poiché viene controllato il tempo di compilazione e produce un codice più pulito.

È possibile aggirare il problema del confronto utilizzando Dictionary<int, object> e le chiavi di trasmissione enum su int s o specificando un comparatore personalizzato.

+9

Per quanto riguarda le prestazioni, potrebbe non essere vero (sorprendentemente) - http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx – Rashack

+1

È sempre possibile specificare il proprio comparatore. Questo non è un problema con Dizionario o enum, ma il comparatore –

5

Penso che dovresti iniziare concentrandoti sulla correttezza. Questo è molto più importante della differenza minima tra le minori differenze di prestazioni che possono verificarsi all'interno del programma. In questo caso mi concentrerei sulla corretta rappresentazione dei tuoi tipi (enum sembra essere il migliore). Quindi, successivamente, profili la tua applicazione e se c'è un problema, allora e solo allora dovresti risolverlo.

Rendere il codice più veloce nel processo è in genere un processo semplice. Prendi il link che skolima ha fornito. Se avessi scelto enum, sarebbe stata una correzione di circa 10 minuti per rimuovere un problema di prestazioni nella tua applicazione. Voglio sottolineare la parola potenziale qui. Questo è stato sicuramente un problema per NHibernate, ma sul fatto che sarebbe un problema per il tuo programma sarebbe determinato esclusivamente dagli usi.

D'altra parte, rendere il codice più corretto in seguito nel processo tende ad essere più difficile. In un problema abbastanza grande scoprirai che le persone iniziano ad assumere dipendenze dagli effetti collaterali del precedente cattivo comportamento. Questo può rendere la correzione del codice senza interrompere altri componenti.

1

non può applicarsi ma ...

essere consapevoli che enumerazioni sono compiled come constants che possono causare ridistribuzione di tutti i complessi che fanno riferimento l'enumerazione se viene alterato. (Ad esempio, la costante è codificata in fase di compilazione per tutti gli assembly che la utilizzano).

+0

così sarebbe la versione della stringa in modo da non seguire il tuo punto. – Seabizkit

-1

Direi che la versione enum è più veloce. Sotto il cofano il dizionario fa riferimento a tutto tramite hashcode. La mia ipotesi è che è più lento generare l'hashcode per una stringa. Tuttavia, questo è probabilmente trascurabilmente più lento, ed è sicuramente più veloce di qualsiasi cosa come un confronto di stringhe. Sono d'accordo con gli altri manifesti che hanno affermato che un enum è più pulito.

Problemi correlati