2009-12-04 4 views
1

La performance de temps d'exécution (exécution) du code dans une classe qui est chargée par la réflexion identique au même code lorsque la classe est créé en utilisant le nouveau mot-clé?Performance en exécution du code dans la classe créée en utilisant la réflexion par rapport à une classe 'normale'

Je dis oui. Mais j'en discutais avec un collègue qui croit que le code axé sur la réflexion est toujours plus lent. Mon avis est que quelle que soit la façon dont la classe a été chargée/créée, les performances seront identiques car le compilateur JIT ne se soucie pas du chargement d'une classe.

Ai-je raison? De toute façon, j'apprécierais toutes les références qui peuvent aider à clarifier cela.

(NB:.. Je ne parle pas de la performance de la création une classe en utilisant la réflexion par rapport au nouveau mot-clé Je fais référence au code réel dans les méthodes de la classe après qu'il a été créé)

Répondre

1

Cela dépend de la façon dont vous l'exécutez ;-P

Une fois que vous êtes à l'intérieur les méthodes sur le type chargé, oui: GIT régulier etc applique normalement (noter que les contrôles de sécurité peuvent rendre les choses un peu plus lent s'il est partiellement approuvé, mais pas beaucoup).

Mais d'abord vous devez Invoke un code sur l'objet dynamique:

  • Si vous pouvez lancer l'objet à une interface ou classe de base qui est connue statiquement, il sera identique.
  • Si cela n'est pas possible, mais que vous pouvez lier des opérations spécifiques à des délégués connus (par exemple Func<string,int>, via Delegate.CreateDelegate), alors il sera presque aussi rapide, mais moins pratique.
  • Si vous faites tout par DynamicInvoke(), ce sera très joli.
  • Dans 4.0, dynamic peut offrir une maison de transition, en ce qu'il offre le type de canard avec la mise en cache optimisée par type.

Alors, comment y accéder?

+0

Marc, Nous utilisons Activator.CreateInstance() et cast l'objet retourné à un type de classe connu. Dès lors, il est toujours accessible via cette instance fortement typée. Nous travaillons avec C# 2 et nous passerons bientôt à C# 3/4. – Ash

+0

Point intéressant sur les contrôles de sécurité. C'est peut-être ce à quoi mon collègue faisait allusion, même s'ils ne l'ont pas dit à l'époque. – Ash

+0

Je pense que votre collègue est trompé sur la différence entre * charger * quelque chose par réflexion et * appeler tout * par réflexion. Il semble que cela devrait fonctionner correctement dans votre scénario avec un type de classe connu. –

1

Oui, une fois chargée, la performance est la même.

La pénalité de performance de la réflexion est liée à la lecture des métadonnées de l'assemblage, mais le temps d'exécution sera exactement le même. C'est-à-dire qu'une fois que l'instance a été créée et que vous y avez fait référence, elle se comporte comme n'importe quelle autre classe (y compris la compilation JIT et tout).

+0

Des références telles que des pages Web, des blogs, etc.? – Ash

+0

Pas vraiment, juste le chapitre 4 de .NET Framework de Joe Duffy. Si vous avez accès, ouvrez ce chapitre et lisez la partie de chargement de l'assemblage et la partie de métadonnées de l'assemblage intérieur. –

0

Cela dépend de la façon dont vous utilisez la réflexion. C'est toujours plus lent, mais vous pouvez réduire la différence de temps si vous utilisez IL emit pour créer une méthode d'usine en cours d'exécution. Si vous utilisez le simple Activator.CreateInstance, il sera beaucoup plus lent.

+0

Vous avez mal compris ma question, voir le NB. – Ash

+0

Oui, vous avez raison. Pardon.Jorge a raison, l'exécution du code est la même que celle du code. –

Questions connexes