Che è più veloce / più efficiente: Dizionario < stringa, oggetto > o Dizionario < enum, oggetto > ;?

StackOverflow https://stackoverflow.com/questions/820200

  •  03-07-2019
  •  | 
  •  

Domanda

I tipi enum sono più veloci / più efficienti dei tipi stringa se usati come chiavi del dizionario?

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

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

Considera quanto segue: NOTA: solo 5 proprietà 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 delle precedenti sarà migliore se usata come chiave in un dizionario!

È stato utile?

Soluzione

Certamente la versione enum è migliore (quando entrambi sono applicabili e hanno senso, ovviamente). Non solo per le prestazioni (può essere migliore o peggiore, vedi l'ottimo commento di Rashack) dato che è stato verificato il tempo di compilazione e risulta in un codice più pulito.

Puoi aggirare il problema del comparatore usando Dizionario < int, oggetto > e lanciando le chiavi enum su int o specificando un comparatore personalizzato .

Altri suggerimenti

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

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

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

Usa enum per ottenere un codice più pulito e più gradevole, ma ricorda di fornire un comparatore personalizzato se sei interessato alle prestazioni: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx .

Potrebbe non essere applicabile ma ...

Essere consapevoli del fatto che gli enum sono compilato come costanti che può causare la ridistribuzione di tutti gli assiemi che fanno riferimento l'enum se è alterato. (ovvero la costante viene codificata in fase di compilazione in tutti gli assembly che la utilizzano).

Immagino che la versione di enum sia più veloce. Sotto il cofano il dizionario fa riferimento a tutto con hashcode. La mia ipotesi è che sia 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. Concordo con gli altri poster che affermano che un enum è più pulito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top