Imagine o 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;
}
}
Fiquei curioso para saber se há uma diferença no desempenho dessas duas funções, porque a primeira DEVE SER MAIS LENTA que a segunda - uma vez que é necessário verificar duas vezes se o dicionário contém um valor, enquanto a segunda função precisa acessar apenas o dicionário uma vez, mas WOW, na verdade é o oposto:
Loop para 1 000 000 valores (sendo 100 000 existentes e 900 000 inexistentes):
primeira função: 306 milissegundos
segunda função: 20483 milissegundos
Por que é que?
EDIT: Como você pode notar nos comentários abaixo desta pergunta, o desempenho da segunda função é realmente um pouco melhor que o primeiro caso haja 0 chaves inexistentes. Porém, quando houver pelo menos uma ou mais chaves inexistentes, o desempenho da segunda diminuirá rapidamente.
O(1)
na pesquisa no dicionário ... Especialmente porque realizar duas O(1)
operações ainda é assintoticamente O(1)
.
ContainsKey
é esperadoO(1)
...