9
votes

Qu'est-ce qui agit pire: réflexion ou boxe?

Je travaille sur la création de mon propre cadre DI qui crée des usines de délégation comme un exercice d'apprentissage. Ma façon de créer des délégués dactylographiés consiste à utiliser des expressions pour créer une fonction qui appelle une méthode statique en référence à mon conteneur et à tous les paramètres du constructeur.

Ceci a lancé une question intéressante en ce qui concerne les types de valeur. Qui est le plus performant:

a) Utilisation de la réflexion pour sélectionner une méthode générique statique avec le nombre correct de paramètres, utilisez makegenericMethod pour supprimer les génériques

b) Optez pour l'objet Params Ancien Mode [] et prenez le coup sur la boxe?


6 commentaires

Toute raison pour laquelle cet "exercice d'apprentissage" ne nécessite pas de profilage diverses configurations pour trouver la solution optimale? ;-) Je vais toujours donner un +1 cependant.


c) Utiliser une surcharge avec des paramètres génériques?


Pas vraiment possible, expression.Call prend une méthodeInfo pour que vous puissiez sélectionner la méthode correcte avec les types corrects à l'avant.


Vous pouvez inférer les types corrects des paramètres de type générique? typeof (t1) , typeof (t2) etc ...


Qui est plus lent n'est pas pertinent. La question pertinente est est soit assez rapide pour votre application ? S'il s'avère que cela n'est pas suffisamment rapide pour votre application, sachez que plus lentement n'aident pas. S'il s'avère que les deux sont suffisamment rapides, sachant que plus lentement n'est pas pertinent.


@ERIC LIPPERT Merci de commenter et je pense que mon titre est trop négatif, j'étais plus intéressé par l'élargissement de ma compréhension des implications de la performance de la boîte de réflexion V Boxe pour m'aider à comprendre le CLR et C # mieux.


5 Réponses :


18
votes

IME, le temps de boxe n'est rien comparé à la réflexion.


0 commentaires

3
votes

Je suppose que cette réflexion serait beaucoup plus lente, probablement des ordres de magnitude p.

C'est assez facile à tacher, donnez-lui un aller et publier vos résultats :)


0 commentaires

3
votes

Dans ce cas, la boxe sera plus rapide des ordres de grandeur que la réflexion.

Bien sûr, vous pouvez toujours mettre en cache les résultats de la réflexion.


0 commentaires

1
votes

Si l'on doit traiter un million d'éléments, la boxe Chaque élément sera moins efficace que de les traiter sans la boxe, mais sera beaucoup plus rapide que l'utilisation de la réflexion pour traiter le type de chaque élément.

D'autre part, dans de nombreux scénarios, il sera possible de traiter un million d'éléments de type générique t à l'aide de la réflexion une fois, sur le type t , pour construire Un objet qui peut traiter quelque chose de type t sans boxe, puis cache le résultat de celui de la vie du programme. C'est comme ça que c'est quelque chose comme Equalitalcomparer .default travail. Une telle approche peut facilement être plus qu'un ordre de grandeur plus rapidement que de boxer chaque article.


1 commentaires

N'oubliez pas que vous auriez encore besoin d'accéder à votre cache de réflexion, probablement à travers un dictionnaire. Je ne serais pas surpris si une petite boxe est toujours plus rapide que ces recherches - en particulier si les clés de chaîne sont impliquées (qui peuvent ou non être le cas).



2
votes

en général , je dirais même si la boxe avait été plus lente (dans une certaine mesure non perceptible), c'est la bonne façon d'aller. La réflexion est un outil permettant de faciliter une méta-programmation de Sorta - lorsque vous devez faire du travail sur le code lui-même, et pour ne pas faciliter votre logique commerciale d'applications, et vous ne devriez donc pas l'utiliser sans une bonne raison. Un programmeur doit d'abord penser du domaine physique. Cela dit, dans votre cas, cela n'a probablement pas d'importance car vous allez déjà la méta de la méta je pense . Utilisation d'un objet vous donne toujours la sécurité de la compilation dans une certaine mesure et meilleure maintenance .

Comme d'autres l'ont dit, la réflexion est la plus lente ici (sauf si vous ne mettez pas en cache). Une autre chose qui vient à la faveur de la boxe est que vous êtes très probablement de toute façon une boxe quand vous traitez avec la réflexion . L'API de réflexion traite toujours de objet , de sorte que si vous récupérez une valeur d'instance, vous devez vous envoyer une boîte de conserve. De même, appelant Gettype sur une instance de type de valeur First case sur objet que vous devrez peut-être avoir à si vous n'avez pas l'argument de type, mais seulement l'instance.

Mais une meilleure alternative est de compter sur les génériques. Certains beaux modèles sont détaillés ici.


0 commentaires