Frage Was ist schneller: Ausdrucksbäume oder IL manuell ausstrahlen


Gibt es einen Leistungsunterschied zwischen dem Erstellen einer IL direkt ausstrahlenden Methode und nicht dem Erstellen eines Ausdrucksbaums?


9
2018-05-13 20:27


Ursprung


Antworten:


Letztlich ist die API des Ausdrucksbaums wirklich nur eine vertrautere API über reelection.emit, und daher sind sie effektiv äquivalent, obwohl ich glaube, dass es viele Dinge gibt, die Sie nicht in Ausdrucksbäumen tun können, die Sie direkt reflection.emit verwenden können.

Reflection.Emit ist insgesamt die schnellste, aber genauso wie eine for-Schleife schneller als foreach Im Algemeinen. Es gibt viele Szenarien, in denen Sie Code schreiben können, der mit reflection.emit schneller ausgeführt wird als mit dem Ausdruck api, aber in den meisten Fällen sollten sie gleichwertig sein.

Nun, der Ausdruck API bietet sich an, ein etwas besserer Weg zu sein, Dinge aus mehreren Gründen zu machen.

  1. Es ist einfacher zusammensetzbar als direkte Reflektion. Sie können einen Ausdrucksbaum verwenden und ihn so umschreiben, dass er einige Logik viel einfacher hinzufügt als mit direkter IL
  2. In der Zukunft können Optimierungen hinzugefügt werden, die Sie möglicherweise nicht verstehen, die bei der Verwendung von direction reflection.emit nicht aufgetreten wären.

Letztendlich würde ich sagen, es ist eine Wäsche. Wenn es wirklich kritisch ist und Sie reflection.emit ziemlich gut kennen, können Sie normalerweise einige Abkürzungen in IL verwenden, die Sie nicht mit der Ausdruck-API erhalten, aber ansonsten sollten sie im Allgemeinen ziemlich gleichwertig sein.


9
2018-05-13 20:59



Ausgezeichnete und komplexe Frage. Bis vor kurzem konnte Expression nicht mit allen Szenarien fertig werden - in vielen Fällen war dies keine Frage. Dies ändert sich mit der Einführung von Expression.Block usw. In den meisten "üblichen" Fällen ist die Verwendung des Ausdrucks wahrscheinlich mehr als ausreichend, aber ich gestehe, dass ich keine genauen Messungen habe, einfach aus dem Grund, dass ich während ich viel IL mache ziele auch auf Frameworks auf niedriger Ebene, die keinen Luxus wie Expression haben (und sicherlich nicht Expression.Block). Ich neige auch dazu, komplexe "Decorator" -Ansätze zu verwenden, die sich gut eignen, um Gymnastik in IL zu stapeln, aber nicht notwendigerweise in Expression (wenn Ihre IL atypisch genug ist, dass Reflektor und Gegner damit kämpfen, dann kartiert sie wahrscheinlich auch nicht sauber zu Ausdruck - und meine IL neigt dazu, ziemlich knorrig zu sein).

Entschuldigung, ich kann Ihnen keine numerischen Daten mehr geben - wichtige Punkte:

  • Wenn Sie Framework-Anforderungen haben, ist die Frage strittig
  • Andernfalls müssten Sie ein Profil erstellen

11
2018-05-13 20:42