L'amélioration de la performance de la réflexion sur les solutions de rechange devrais-je envisager?
J'ai besoin de définir de façon dynamique les valeurs sur un tas de propriétés ou sur un objet, appeler cela une transmission de l'objet.
Il y aura un bon nombre de ces la transmission des objets qui seront créés et ont ses propriétés définies dans un court espace de temps. Je veux éviter l'utilisation de la réflexion.
Sont il des alternatives? Si il y a des implémentations échantillon j'ai pu regarder?
- Aucune raison pourquoi vous voulez éviter de réflexion?
Vous devez vous connecter pour publier un commentaire.
Utilisation
Délégué.CreateDelegate
à son tour unMethodInfo
dans un typage fort délégué. Cela peut améliorer les performances massivement. J'ai un blog post à ce sujet avec des exemples de code. Notez que ce n'est que va aider si vous avez besoin de définir les mêmes propriétés à de nombreuses reprises, fondamentalement, cela signifie que beaucoup de type de vérification est fait une fois lorsque vous créez le délégué, plutôt qu'à chaque invocation.Marc Gravel a un HyperPropertyDescriptor projet qui permet d'obtenir des performances encore meilleures, mais introduit un supplément de dépendance. Ce projet est devenu le point de départ pour la plus moderne Rapide Membre (github). En général, vous utilisez Rapide au cours des HyperProperty.
Dans .NET 4.0 (version bêta), vous pouvez le faire avec la mise à jour des arbres d'expression, à l'aide de
Expression.Block
etExpression.Assign
- puis compilez qui à tapé délégué; le travail est accompli.Dans .NET 2.0 et au-dessus (comme Jon mentionné) HyperDescriptor est une option raisonnable - il fonctionne comme une coutume
PropertyDescriptor
mise en œuvre, de sorte que vous venez de faire un code comme:Cela a encore un peu de boxe, mais qui n'est en fait pas un goulot d'étranglement.
La réflexion peut être incroyablement rapide si vous le faites à droite (pas aussi rapide que la statique de code, bien sûr).
Trouver un bien-setter est lente. L'invocation d'un délégué est rapide.
Vous avez besoin pour obtenir et cache
Delegate
objets pour chaque propriété-setter de chaque type de DTO. C'est la partie lente, mais c'est un hit. Ensuite, vous pouvezInvoke
chaque de la mise en cache des délégués pour le bien-setters d'un DTO type, en passant dans la DTO de l'objet et de la nouvelle valeur de la propriété, mais cette partie sera très rapide.Avez-vous établi avec certitude que l'aide de la réflexion est trop lent? Bien que la réflexion dans l' .NET est pas aussi vite comme statique de code, il est toujours extrêmement rapide. Vous devez écrire le code le plus simple possible - même si qui utilise la réflexion et ne reviendra à optimiser si vous remarquez des problèmes de performances et de les isoler à votre utilisation de la réflexion. La plupart du temps, vous n'aurez pas de problèmes. La réflexion est utilisé dans toutes sortes de performance sensibles au code, comme ASP.NET MVC.
Réflexion a obtenu une mauvaise réputation de l'île de Java où il est (ou au moins l'habitude d'être) très lent. Ce n'est pas le cas .net donc je ne comprends pas votre opposition à l'utiliser. Aussi je suis d'accord avec Rex, vous ne pouvez pas dire quelque chose a de la mauvaise performance, sans réellement mesurer.
Vous pouvez utiliser de génération de code légère. Voici quelques articles: