Estoy desarrollando un compilador que emite código IL. Es importante que el IL resultante sea JIT a los códigos de máquina más rápidos posibles por los compiladores Mono y Microsoft .NET JIT.
Mis preguntas son:
¿Tiene sentido optimizar patrones como:
'stloc.0; ldloc.0; ret' => 'ret' 'ldc.i4.0; conv.r8' => 'ldc.r8.0'y tal, o son los JIT lo suficientemente inteligentes como para encargarse de esto?
¿Existe una especificación con la lista de optimizaciones realizadas por los compiladores Microsoft/Mono JIT?
¿Hay alguna buena lectura con recomendaciones prácticas/mejores prácticas para optimizar IL para que los compiladores JIT puedan, a su vez, generar el código de máquina más óptimo (en cuanto al rendimiento)?
MyStruct s; sx = 1; sx = 1; no está optimizado por RyuJIT. s = s; tampoco lo es sx + sx carga x dos veces desde la memoria. Espera poco.Las conversiones redundantes y la carga/almacenamiento como ese son un efecto secundario bastante inevitable de un analizador recursivo decente. Técnicamente, puedes deshacerte de ellos con un optimizador de mirilla. Pero no hay de qué preocuparse, los compiladores de C# y VB.NET también los generan.
Los nervios de .NET/Mono existentes son muy buenos para optimizarlos. Se enfocan en optimizar el código que realmente importa para la velocidad de ejecución, el código máquina. Con la gran ventaja de que cualquiera que escriba un compilador que genere IL automáticamente se beneficia de estas optimizaciones sin tener que hacer nada especial.
Las optimizaciones de jitter están cubiertas en esta publicación .