2009-08-27 11 views
6

No estoy esperando un sí o un no definitivo. Cualquier conocimiento que tengas lo consideraré como una respuesta.Si las optimizaciones están habilitadas, ¿el JIT siempre alineará este método?

private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate) 
{ 
    return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C"); 
} 
+0

Es difícil decir "sí" a esto, pero dado que es privado, supongo que sí. –

+5

El compilador de C# nunca incluye * nada *. Para obtener una lista de optimizaciones que realiza el compilador de C#, en lugar del compilador de jit, consulte mi artículo sobre el tema. http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx –

+0

Gracias Eric, parece que tengo muchas cosas que leer. – ChaosPandion

Respuesta

21

Inlining es un detalle de implementación del JIT, no del compilador de C#. De Eric Gunnerson's blog:

El JIT utiliza una serie de heurísticas para decidir si un método debe ser en forrado. La siguiente es una lista de el más importante de los (nota que esto no es exhaustiva):

  • Métodos que son mayores que 32 bytes de IL voluntad no ser inline.
  • Las funciones virtuales no están en línea.
  • Los métodos que tienen un control de flujo complejo no se alinearán. El control de flujo complejo es cualquier otro control de flujo que si/entonces/else; en este caso, el interruptor o mientras.
  • Los métodos que contienen bloques de manejo de excepciones no son en línea, aunque los métodos que arrojan excepciones siguen siendo candidatos para en línea.
  • Si cualquiera de los argumentos formales del método son estructuras, el método no estará en línea.

pesar de que su método es bastante corto y no muy complejo por lo que podría coincidir con la heurística, Nullable<T> es una struct por lo que supongo que su método no se colocarán en línea.

Como regla general, si este método mejora el rendimiento, el JIT alineará este método; de lo contrario no lo hará. Pero esto es realmente un detalle de implementación del JIT y nada debe codificar:

me habría considerar cuidadosamente explícitamente que codifican para estas heurísticas porque podrían cambiar en futuras versiones del ECI. No comprometa la corrección del método para intentar garantizar que estará en línea.

EDIT: Al parecer lo de estructuras no están inline es fuera de fecha; la información actualizada se puede encontrar en Vance Morrison's blog.

+2

La opción struct ya no es válida a partir de .NET 3.5sp1. los parámetros struct pueden ser insertados ahora. –

+0

@Reed Copsey: gracias por la información. Punto probado :) – dtb

Cuestiones relacionadas