Imagina el código:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Método 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Método 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
Tenía curiosidad por saber si hay una diferencia en el rendimiento de estas 2 funciones, porque la primera DEBE ser MÁS LENTA que la segunda, dado que debe verificar dos veces si el diccionario contiene un valor, mientras que la segunda función solo necesita acceder al diccionario una vez pero GUAU, en realidad es lo contrario:
Bucle para 1 000 000 valores (con 100 000 existentes y 900 000 no existentes):
primera función: 306 milisegundos
segunda función: 20483 milisegundos
¿Porqué es eso?
EDITAR: Como puede observar en los comentarios debajo de esta pregunta, el rendimiento de la segunda función es en realidad ligeramente mejor que la primera en caso de que haya 0 teclas no existentes. Pero una vez que hay al menos 1 o más claves no existentes, el rendimiento de la segunda disminuye rápidamente.
O(1)
en la búsqueda en el diccionario ... Especialmente porque hacer dos O(1)
operaciones sigue siendo asintóticamente O(1)
.
ContainsKey
se esperaO(1)
...