La lenteur est la Réflexion
J'ai récemment créé une couche d'interface de distinguer les DataAccessProvider de notre couche de logique Métier.
Avec cette approche, nous pouvons changer notre choix de DataAccessProvider chaque fois que nous voulons changer les valeurs dans le Web/App.Config.
(plus de détails peuvent être donnés si nécessaire).
De toute façon, pour ce faire, nous utilisons la réflexion pour accomplir notre DataProvider de classe sur lesquels nous pouvons travailler.
///<summary>
///The constructor will create a new provider with the use of reflection.
///If the assembly could not be loaded an AssemblyNotFoundException will be thrown.
///</summary>
public DataAccessProviderFactory()
{
string providerName = ConfigurationManager.AppSettings["DataProvider"];
string providerFactoryName = ConfigurationManager.AppSettings["DataProviderFactory"];
try
{
activeProvider = Assembly.Load(providerName);
activeDataProviderFactory = (IDataProviderFactory)activeProvider.CreateInstance(providerFactoryName);
}
catch
{
throw new AssemblyNotFoundException();
}
}
Mais maintenant, je me demande comment une lente réflexion est?
- Assurément, il serait trivial de créer un harnais de test pour indice de référence de l'?
- Si l'usine est un singleton, puis de l'Assemblée.La charge ne doit être appelé qu'une seule fois?
- stackoverflow.com/questions/25458/...
Vous devez vous connecter pour publier un commentaire.
Dans la plupart des cas: plus que assez rapide. Par exemple, si vous utilisez cette fonction pour créer un DAL objet wrapper, le temps pris pour créer l'objet par la réflexion sera minuscule par rapport au temps qu'il faut pour se connecter à un réseau. Ainsi, l'optimisation, ce serait une perte de temps.
Si vous êtes en utilisant la réflexion dans une boucle serrée, il y a des astuces pour l'améliorer:
where T : new()
etMakeGenericType
)Delegate.CreateDelegate
(à typé délégué; ne fonctionne pas pour les constructeurs)Reflection.Emit
- hardcoreExpression
(commeDelegate.CreateDelegate
, mais plus souple, et travaille pour les constructeurs)Mais pour vos besoins,
CreateInstance
est parfaitement bien. S'en tenir à cela, et de garder les choses simples.Edit: alors que le point sur la performance relative reste, et bien que la chose la plus importante, "mesurer", reste, je me dois de préciser certains. Parfois... il ne question. Mesurez d'abord. Toutefois, si vous trouvez qu'il est trop lent, vous pouvez jeter un oeil à quelque chose comme FastMember, qui fait tout le
Reflection.Emit
code tranquillement dans le fond, pour vous donner une bonne API; par exemple:qui est simple, mais sera très rapide. Dans l'exemple particulier-je mentionner à propos d'un DAL wrapper—si vous faites cela beaucoup, pensez à quelque chose comme dapper, ce qui fait tout le
Reflection.Emit
code en arrière-plan pour vous donner le plus rapidement possible, mais facile à utiliser l'API:Ses plus lent par rapport aux non-réfléchissant code. La chose importante n'est pas si lente, mais si son lent où il compte. Par exemple, si vous instancier des objets à l'aide de la réflexion dans l'environnement web devrait concurency peut s'élever jusqu'à 10K, ce sera lent.
De toute façon, il est bon de ne pas être préoccupé au sujet de la performance à l'avance. Si les choses s'avère être lent, vous pouvez toujours les accélérer si vous avez conçu les choses correctement, de sorte que les pièces que vous vous attendiez peut-être besoin d'optimisation dans le futur, sont localisées.
Vous pouvez vérifier ce fameux article si vous avez besoin d'accélérer:
Dynamique... Mais Rapide: Le Conte des Trois Singes, le Loup et l'DynamicMethod et à l'aide de la classe ilgenerator Classes
Voici quelques liens qui pourraient vous aider:
Réflexion n'est pas lent. L'invocation d'une méthode par réflexion est environ 3 fois plus lent que la normale. C'est pas un problème si vous faites cela, juste une fois, ou dans les situations critiques. Si vous l'utilisez à 10'000 fois en un temps critique de la méthode, je voudrais envisager de changer la mise en œuvre.
J'ai pensé que je ferais un petit test pour démontrer la lenteur de la réflexion est par rapport à sans.
Avec La Réflexion
Temps Total: 52254 nanosecondes
Sans Réflexion
Temps Total: 868 nanosecondes
Quoique, pas tout à fait juste puisque la réflexion a également pour récupérer un attribut spécifique de chaque propriété à 58*18 fois au sommet de la création d'un nouvel objet par la réflexion, mais c'est au moins fournit un certain point de vue.
Autre que de suivre les liens donnés dans d'autres réponses et de s'assurer que vous n'êtes pas écrit "pathalogically mauvais" code alors pour moi, la meilleure réponse à cette question est pour tester vous-même.
Que vous savez où vous les goulets d'étranglement sont, combien de fois votre code de réflexion sera de l'utilisateur, si le code de réflexion seront en boucles serrées etc. Vous connaissez votre entreprise, combien d'utilisateurs peuvent accéder à votre site, ce que la perf exigences.
Toutefois, compte tenu de l'extrait de code vous ai montré ici, alors j'imagine que les frais généraux de la réflexion ne va pas être un problème de masse.
VS.NET web tests et essais de performance des fonctionnalités de prendre la mesure de la performance de ce code assez simple.
Si vous n'utilisez pas la réflexion, ce que votre code ressemble? Quelles sont les limites qu'il aura? Il se peut que vous ne pouvez pas vivre avec les limites que vous vous retrouvez avec si vous supprimez le code de réflexion. Il pourrait être intéressant d'essayer de concevoir ce code sans la réflexion pour voir si c'est possible ou il l'alternative est souhaitable.
Je faisais somethign similaires, jusqu'à ce que j'ai commencé à jouer avec le Cio. Je voudrais utiliser un Printemps définition de l'objet de spécifier le fournisseur de données - SQL, XML, ou se moque de!