¿Qué es más rápido: árboles de expresión o emisión manual de IL?

c# expression-trees reflection reflection.emit

Pregunta

¿Hay una diferencia de rendimiento entre crear un método que emita IL directamente, en lugar de construir un árbol de expresiones?

Respuesta aceptada

En última instancia, la API del árbol de expresiones es realmente una API más familiar sobre relection.emit y, por lo tanto, son efectivamente equivalentes, aunque creo que hay muchas cosas que no se pueden hacer en los árboles de expresiones que se pueden realizar a través de la reflexión directa.emit.

Reflection.Emit es el más rápido en general, pero de la misma manera que un bucle for es más rápido que foreach en general . Hay muchos escenarios en los que puede escribir código que se ejecute más rápido con reflection.emit que con la expresión api, pero en la mayoría de los casos deberían ser equivalentes.

Ahora, la expresión API se presta a ser una forma ligeramente mejor de hacer las cosas por un par de razones.

  1. Se puede componer de una manera más sencilla que utilizando la reflexión directa. Puede tomar un árbol de expresiones y volver a escribirlo para agregar algo de lógica mucho más fácil que con el uso de IL directo.
  2. Es posible que en el futuro se agreguen optimizaciones que tal vez no entienda que no se habrían producido al utilizar la función reflexión de la dirección.

Así que en última instancia, diría que es un lavado. Si es realmente crítico y conoce a reflection.emit bastante bien, generalmente puede tomar algunos atajos en IL que no obtendrá utilizando la expresión API, pero aparte de eso, en general, deberían ser bastante equivalentes.


Respuesta experta

Excelente y compleja pregunta. Anteriormente, Expression simplemente no podía manejar todos los escenarios, por lo que en muchos casos no era una pregunta. Esto cambia con la introducción de Expression.Block, etc. En la mayoría de los casos "comunes", el uso de Expression es probablemente más que suficiente, pero confieso que no tengo mediciones precisas, simplemente porque hago mucha IL, también se enfoca en marcos de nivel inferior que no tienen lujos como Expression (y ciertamente no Expression.Block). También tiendo a usar enfoques complejos de "decorador" que se prestan muy bien para apilar gimnasia en IL, pero no necesariamente en Expresión (de hecho, si su IL es lo suficientemente atípica para que el reflector y otros luchen con ella, entonces probablemente tampoco se mapea limpiamente a la expresión - y mi IL tiende a ser bastante retorcida).

Lo siento, no puedo darte más datos numéricos - puntos clave:

  • Si tiene requisitos de marco de nivel inferior, la pregunta es discutible.
  • de lo contrario, tendrías que perfil


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow