Immagina il codice:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Metodo 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Metodo 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Ero curioso di sapere se c'è una differenza nelle prestazioni di queste 2 funzioni, perché la prima DOVREBBE ESSERE PIÙ LENTA della seconda - dato che deve controllare due volte se il dizionario contiene un valore, mentre la seconda funzione deve accedere solo al dizionario una volta ma WOW, in realtà è l'opposto:
Ciclo per 1 000 000 valori (con 100000 esistenti e 900000 inesistenti):
prima funzione: 306 millisecondi
seconda funzione: 20483 millisecondi
Perché?
EDIT: Come puoi notare nei commenti sotto questa domanda, l'esecuzione della seconda funzione è in realtà leggermente migliore della prima nel caso in cui ci siano 0 chiavi non esistenti. Ma una volta che ci sono almeno 1 o più chiavi inesistenti, le prestazioni della seconda diminuiscono rapidamente.
O(1)
ricerca nel dizionario ... Soprattutto dal momento che fare due O(1)
operazioni è ancora asintoticamente O(1)
.
ContainsKey
è previstoO(1)
...