Imaginez le code:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
Méthode 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
Méthode 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
J'étais curieux de savoir s'il y avait une différence dans les performances de ces 2 fonctions, car la première DEVRAIT être plus LENTE que la seconde - étant donné qu'elle doit vérifier deux fois si le dictionnaire contient une valeur, tandis que la deuxième fonction n'a besoin d'accéder qu'au dictionnaire uniquement une fois mais WOW, c'est en fait l'opposé:
Boucle pour 1 000 000 de valeurs (avec 100 000 existantes et 900 000 non existantes):
première fonction: 306 millisecondes
deuxième fonction: 20483 millisecondes
Pourquoi donc?
EDIT: Comme vous pouvez le remarquer dans les commentaires ci-dessous cette question, les performances de la deuxième fonction sont en fait légèrement meilleures que la première dans le cas où il n'y a 0 clé non existante. Mais une fois qu'il y a au moins 1 ou plusieurs clés non existantes, les performances de la seconde diminuent rapidement.
O(1)
recherche dans le dictionnaire ... D'autant plus que faire deux O(1)
opérations est toujours asymptotique O(1)
.
ContainsKey
c'est prévuO(1)
...