72 votes

Quel est le "coût" de .NET réflexion?

Double Possible:
Comment onéreux .NET réflexion?

Je suis actuellement dans une programmation mentalité que la réflexion est mon meilleur ami. Je l'utilise beaucoup pour le chargement dynamique de contenu qui permet de "lâche mise en œuvre" plutôt qu'une stricte des interfaces, ainsi que beaucoup d'attributs personnalisés.

Qu'est-ce que le "vrai" coût de l'utilisation de la réflexion?

Est-il en vaut la peine pour souvent reflétée types sont mis en cache, la réflexion, comme notre propre pré-LINQ DAL code objet sur toutes les propriétés à la table des définitions?

Serait la mise en cache de la mémoire outwieght le reflet d'utilisation de l'UC?

56voto

smaclell Points 3164

La réflexion nécessite une grande quantité de métadonnées de type à être chargé et ensuite traitées. Cela peut entraîner une plus grande charge de la mémoire et plus lent à l'exécution. Selon cet article, les modifications de propriétés est d'environ 2,5 x-3x plus lent et l'invocation de méthode est de 3,5 x-4x plus lente.

Voici un excellent article de MSDN expliquant comment prendre le temps de réfléchir plus vite et où la surcharge est. Je vous recommande vivement de lire si vous voulez en savoir plus.

Il est également un élément de complexité de la réflexion ajouter le code qui rend ce beaucoup plus déroutant et donc difficile à travailler. Certaines personnes, comme Scott, Hanselman croire que par l'aide de la réflexion vous faites souvent plus de problèmes que de les résoudre. C'est particulièrement le cas si vos équipes est principalement junior devs.

Vous pouvez être mieux à la recherche dans le DLR (Dynamic Language Runtime) si vous avez besoin de beaucoup de comportement dynamique. Avec les nouveaux changements à venir .NET 4.0, vous voudrez peut-être voir si vous pouvez incorporer dans votre solution. L'ajout du support pour les dynamiques à partir de VB et C# faire à l'aide de code dynamique, très élégant et à la création de vos propres objets dynamiques assez simple.

Bonne chance.

EDIT: j'ai fait un peu plus de fouiller Scott site et trouvé ce podcast sur la réflexion. Je n'ai pas écouté, mais il pourrait être la peine.

17voto

Marc Gravell Points 482669

Il y a beaucoup de choses que vous pouvez faire pour accélérer la réflexion. Par exemple, si vous faites beaucoup de bien-accès, puis HyperDescriptor pourrait être utile.

Si vous faites beaucoup de la méthode invoke, alors vous pouvez mettre en cache les méthodes tapé les délégués à l'aide Delegate.CreateDelegate - ce alors à la vérification de type, etc une seule fois (lors d' CreateDelegate).

Si vous faites beaucoup de la construction de l'objet, alors Delegate.CreateDelegate n'aide pas (vous ne pouvez pas l'utiliser sur un constructeur) - mais (3,5) Expression peut être utilisé pour ce faire, encore une fois la compilation d'un typée délégué.

Donc oui: la réflexion est lent, mais vous pouvez l'optimiser sans trop de douleur.

2voto

vanslly Points 2219

Avec un grand pouvoir vient une grande responsabilité.

Comme vous le dites, de réflexion a aussi, des coûts, et en fonction de la façon dont beaucoup de réflexion que vous faites, il peut ralentir l'application vers le bas de manière significative.

L'un des très approrpiate lieux à utilisation c'est pour IoC (Inversion of Control) car, en fonction de la taille de votre application, aurait probablement plus d'avantages que de pas.

2voto

Tom Anderson Points 7228

Merci pour les bons liens et les commentaires, surtout de la part de la gare Jr de Devs, qui a frappé à droite sur l'argent.

Pour nous, il est plus facile pour nos juniors développeurs pour ce faire:

[TableName("Table")]
public class SomeDal : BaseDal
{
    [FieldName("Field")]
    public string Field
}

plutôt que de certaines grandes impelementations de DAL. Cela accélère leur construction de la DAL objets, tout en cachant tous les rouages internes pour les anciens développeurs de l'intestin.

Dommage que LINQ n'est pas venu plus tôt, je me sens à la fois, nous avons écrit que la moitié.

0voto

jonnii Points 17046

Une chose qui peut parfois vous mordre lors de l'utilisation de la réflexion n'est pas de mise à jour des appels à l'aide de la réflexion lors de refactoring. Des outils comme resharper vous invite à mettre à jour les commentaires et les chaînes de caractères lorsque vous modifiez un nom de méthode, de sorte que vous pouvez attraper le plus de cette façon, mais quand vous êtes en appelant les méthodes qui ont été générées de façon dynamique ou le nom de la méthode a été généré dynamiquement, vous risquez de manquer quelque chose.

La seule solution est une bonne documentation approfondie et des tests unitaires.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X