Me gustaría saber si .NET JITter alineará recursivamente funciones pequeñas llamadas desde otras funciones pequeñas.¿El .NET JIT integra una pequeña función que llama a otra función pequeña?
Sólo por ejemplo:
public static float Square(float value)
{
return value * value;
}
public static float Cube(float value)
{
return Square(value) * value;
}
Si llamo Cube
de alguna parte, ¿verdad en línea todo el camino, o voy a terminar con una llamada a la función Square
?
Y, en caso afirmativo, ¿con qué profundidad recurrirá para hacer la alineación? (Supongamos que estoy lo suficientemente loco como para implementar una función Quartic
o Quintic
de la misma manera.)
Interesante ... porque estoy trabajando en XNA donde * todo * es una carroza! Ligeramente concerniente a ... –
* "El compilador JIT x86 no incorpora métodos que devuelven float." * - ¿Estás absolutamente seguro de esto? He buscado alto y bajo y no puedo encontrar ninguna referencia para respaldar esto. Lo mejor que encontré fue esta página en Connect: https://connect.microsoft.com/VisualStudio/feedback/details/536781/unexpected-jit-inlining-behavior que parece implicar que las funciones devuelven float * do *, de hecho, en línea. Y este (antiguo) artículo implica que las reglas de coacción (por lo que tal vez sean diferentes en la práctica) son las mismas para carrozas y dobles: http://blogs.msdn.com/b/davidnotario/archive/2005/08/08/449092. aspx –
@Andrew: las reglas de publicación no están documentadas, solo se insinúa en algunas publicaciones de blog. Importante, porque necesitan poder cambiar esto para mejorar el jitter sin romper las suposiciones hechas del comportamiento documentado. Solo puedo documentar lo que veo que hace mi jitter x86. Y definitivamente no incluye la versión flotante de estos métodos. ¿Ves un comportamiento diferente? –