2011-11-29 11 views
12

Sto scrivendo un servizio in cui le prestazioni sono essenziali e non sono sicuro di quale sia la cosa più veloce. Ho alcuni oggetti (50-200) che hanno ciascuno un ID in loro (ints, ad esempio 84397 o 23845). Sarebbe più veloce avere un dizionario, un elenco di coppie KeyValue o un elenco con gli indici impostati sugli ID con il resto con valori nulli o un array con la stessa idea?Dizionario, elenco o matrice?

+2

Hai provato a eseguire una semplice applicazione di test? –

+2

L'ho avviato, ma ho pensato che chiedere sarebbe stato più efficiente (per i futuri utenti e per me). – SBoss

+3

Quali operazioni devi eseguire con tali oggetti? Cerca per chiave? Cerca valori? Molti inserti? Rimozione delle chiavi? – Marco

risposta

19

Dipende dall'operazione che si desidera eseguire. Supponiamo che tu voglia trovare un oggetto con un dato ID.

  • Il enorme approccio matrice è più veloce: accesso myArray[84397] è una costante di tempo di funzionamento O (1). Certo, questo approccio richiede più memoria.
  • Il dizionario è quasi altrettanto veloce ma richiede meno memoria, poiché utilizza uno hash table interno.
  • La lista di coppie approccio è il più lento, dal momento che potrebbe essere necessario attraversare l'intero elenco per trovare la voce, che produce O (n) complessità.

Quindi, nella tua situazione, sceglierei il dizionario, a meno che le prestazioni marginalmente migliori dell'enorme array siano davvero rilevanti nel tuo caso.

+0

Grazie per l'aiuto, userò il dizionario (assumendo marginalmente significa qualcosa come 1ms più veloce). – SBoss

+0

Hai scritto "dizionario richiede meno memoria" - non intendevi scrivere richiede più memoria, dal momento che usa internamente una tabella hash? – BornToCode

+4

@BornToCode: richiede meno memoria rispetto all'opzione precedente, l'enorme array. L'enorme array richiede * spazi di archiviazione * maximumID *, mentre il dizionario richiede solo * alcuni punti di spazio costante * numberOfElements *. – Heinzi

8

Dictionary<TKey, TValue> utilizza internamente una tabella hash quindi penso che sarebbe la più veloce.

+2

+1 Questo è esattamente il motivo per cui esiste il dizionario. – James

+2

Un HashTable sarebbe meglio? – SBoss

+2

@SBoss - Il dizionario generico non usa un 'HashTable' internamente, quindi no. Un 'HashTable' è considerevolmente più lento quando usi ValueTypes, come pensi di fare con il tuo' int'. –

-1

È possibile utilizzare anche gli hashtables. Dizionario internamente usando comunque. ma il dizionario ha il vantaggio che si tratta di un tipo GENERICO che offre la sicurezza del tipo.

qui è diverso thread Dictionary Vs HashTable Spero che ti aiuta a decidere.

Praveen

Problemi correlati