Quoi de plus rapide: arbres d'expression ou émettre manuellement IL

c# expression-trees reflection reflection.emit

Question

Existe-t-il une différence de performance entre la création directe d'une méthode émettant IL et la création d'un arbre d'expression?

Réponse acceptée

En fin de compte, l'API de l'arborescence d'expression est en réalité une API plus familière que relection.emit et est donc équivalente, bien que je pense qu'il y a beaucoup de choses que vous ne pouvez pas faire dans les arborescences d'expression que vous pouvez via direct reflect.emit.

Reflection.Emit est l’ensemble le plus rapide, mais de la même manière qu’une boucle for est plus rapide que foreach en général . Il existe de nombreux scénarios dans lesquels vous pouvez écrire du code qui s'exécute plus rapidement à l'aide de reflect.emit plutôt que de l'expression api, mais dans la plupart des cas, ils doivent être équivalents.

Maintenant, l’API d’expression se prête bien à une façon légèrement meilleure de faire les choses pour plusieurs raisons.

  1. Il est plus simple de composer que d’utiliser Direct reflexion.emit. Vous pouvez prendre un arbre d’expression et le réécrire pour ajouter une certaine logique beaucoup plus facilement qu’en utilisant l’IL direct.
  2. Il se peut que des optimisations ultérieures, que vous ne compreniez peut-être pas, se soient produites lors de l’utilisation de la direction reflexion.emit.

Donc, finalement, je dirais que c'est un lavage. Si c'est vraiment critique et que vous connaissez assez réflexion.emit, vous pouvez généralement utiliser des raccourcis dans IL qui ne seront pas obtenus à l'aide de l'API d'expression, mais en dehors de cela, dans leur usage général, ils devraient être relativement équivalents.


Réponse d'expert

Question excellente et complexe. Avant récemment, Expression ne pouvait tout simplement pas gérer tous les scénarios. Dans de nombreux cas, cela n’était donc pas une question. Cela change avec l'introduction de Expression.Block etc. Dans la plupart des cas "courants", l'utilisation d'Expression est probablement plus que suffisante, mais j'avoue que je n'ai pas de mesures précises, simplement parce que, même si je fais beaucoup de IL, ciblez également les cadres de niveau inférieur qui n'ont pas de luxe comme Expression (et certainement pas Expression.Block). J'ai aussi tendance à utiliser des approches complexes de "décorateur" qui se prêtent bien à la gymnastique IL, mais pas nécessairement à Expression proprement à Expression - et mon IL a tendance à être assez génial).

Désolé, je ne peux pas vous donner plus de données numériques - points clés:

  • si vous avez des exigences de cadre de niveau inférieur, la question est sans objet.
  • sinon, il faudrait profiler



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi