Ce qui est plus rapide / plus efficace: Dictionnaire < chaîne, objet > ou Dictionnaire < enum, objet > ;?

StackOverflow https://stackoverflow.com/questions/820200

  •  03-07-2019
  •  | 
  •  

Question

Les types enum sont-ils plus rapides / efficaces que les types chaîne lorsqu'ils sont utilisés comme clés de dictionnaire?

IDictionary<string,object> or IDictionary<enum,object>

En fait, quel type de données convient le mieux comme clé de dictionnaire et pourquoi?

Prenez en compte les éléments suivants: REMARQUE: pour simplifier, 5 propriétés seulement

.
struct MyKeys
{
   public string Incomplete = "IN"; 
   public string Submitted = "SU"; 
   public string Processing="PR"; 
   public string Completed = "CO"; 
   public string Closed = "CL";   
}

et

enum MyKeys
{
   Incomplete, 
   Submitted, 
   Processing, 
   Completed, 
   Closed
}

Lequel des éléments ci-dessus sera meilleur s'il est utilisé comme clé dans un dictionnaire!

Était-ce utile?

La solution

La version enum est certainement meilleure (lorsque les deux sont applicables et ont un sens, bien sûr). Pas seulement pour la performance (cela peut être meilleur ou pire, voir le très bon commentaire de Rashack) car il vérifie le temps de compilation et donne un code plus propre.

Vous pouvez contourner le problème du comparateur en utilisant Dictionnaire < int, objet > et en convertissant les clés enum en int ou en spécifiant un comparateur personnalisé. .

Autres conseils

Je pense que vous devriez commencer par vous concentrer sur la correction. Ceci est bien plus important que la différence minimale entre les différences de performances mineures pouvant survenir au sein de votre programme. Dans ce cas, je me concentrerais sur la représentation correcte de vos types (enum semble être le meilleur). Ensuite, profilez votre application et, s’il ya un problème, corrigez-le uniquement.

Rendre le code plus rapide plus tard au cours du processus est généralement un processus simple. Prenez le lien fourni par skolima. Si vous aviez choisi Énum, la résolution du problème de performance potentiel dans votre application aurait pris environ 10 minutes. Je veux souligner le mot potentiel ici. Il s’agissait là d’un problème pour NHibernate, mais la question de savoir si cela poserait ou non un problème à votre programme serait uniquement déterminée par les utilisations.

D’autre part, rendre le code plus correct plus tard au cours du processus a tendance à être plus difficile. Dans un problème assez important, vous constaterez que les gens commencent à prendre des dépendances sur les effets secondaires du mauvais comportement précédent. Cela peut rendre la correction du code sans compromettre les autres composants.

Utilisez enum pour obtenir un code plus propre et plus agréable, mais n'oubliez pas de fournir un comparateur personnalisé si vous êtes préoccupé par les performances: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx .

Peut ne pas s'appliquer mais ...

Sachez que les enums sont compilé en tant que constantes pouvant entraîner le redéploiement de tous les assemblys faisant référence à l'énumération si elle est modifiée. (c’est-à-dire que la constante est codée en dur lors de la compilation pour tous les assemblys qui l’utilisent).

Je suppose que la version enum est plus rapide. Sous le capot, le dictionnaire référence tout par hashcode. Mon hypothèse est qu'il est plus lent de générer le hashcode pour une chaîne. Cependant, cela est probablement beaucoup plus lent et certainement plus rapide que tout ce qui ressemble à une comparaison de chaîne. Je suis d'accord avec les autres affiches qui ont déclaré qu'une enum est plus propre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top