Pregunta

Estoy jugando con DLR para comprenderlo mejor. Todavía no estoy completamente familiarizado con todos sus conceptos y su terminología, así que lamento los errores terminológicos o conceptuales en mi pregunta.

Básicamente, lo entiendo es que pasas objetos en árboles de expresión pero usas carpetas para exponer la funcionalidad dinámica de tus objetos a otros lenguajes compatibles con DLR. Entonces, en lugar de hacer una adición, por ejemplo, directamente en el árbol de expresión (Con Expression.Add), crea un aglutinante que es invocado por el sitio de la llamada cuando sea necesario y hace la adición por usted.

Sin embargo, dado que pasa objetos alrededor, al final de la operación de suma (si los operandos son, por ejemplo, dos valores Int32), tendrá que encajonar el Int32 resultante a un objeto ya que (todavía en la carpeta) que lo que espera el sitio de la llamada. Tengo un poco de miedo de que este constante boxing / unboxing pueda afectar un poco el rendimiento del tiempo de ejecución.

¿Es realmente así como se supone que funciona (con todo el boxeo / unboxing) o me falta algo?

¿Fue útil?

Solución

En un lenguaje de tipo dinámico, la identificación y optimización de una variable de tipo estático es una optimización específica de dominio. Dentro de la implementación de un lenguaje dinámico particular X, podría mantener una variable local sin caja en el código generado, pero tan pronto como exponga una API de tipo dinámico, no hay forma de garantizar un tipo estático (la naturaleza misma de los lenguajes dinámicos).

Para evitar el boxeo, tendrá que identificar fragmentos de código con los que pueda probar tipos estáticos, y generar código especialmente para ellos a través de Linq.Expressions o ILGenerator .

Otros consejos

En cuanto a las carpetas, también puede implementar una carpeta personalizada. Ese enlazador personalizado puede devolver un tipo no objeto o puede hacer otras optimizaciones específicas. En IronPython utilizamos la capa externa DLR ComboBinder y ComboActionRewriter para optimizar los condicionales. Por ejemplo " si a.b: " puede convertirse en un ComboBinder que realiza tanto el a.b como la conversión a bool. Si a.b resulta en un bool sin caja, evitaremos el boxeo y el unboxing. Planeamos experimentar con más optimizaciones como esta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top