c# - Optimización de variables locales.NET
optimization decimal (1)
Estaba leyendo las fuentes .NET cuando encontré esto:
// Constructs a Decimal from an integer value.
//
public Decimal(int value) {
// JIT today can''t inline methods that contains "starg" opcode.
// For more details, see DevDiv Bugs 81184: x86 JIT CQ:
// Removing the inline striction of "starg".
int value_copy = value;
if (value_copy >= 0) {
flags = 0;
}
else {
flags = SignMask;
value_copy = -value_copy;
}
lo = value_copy;
mid = 0;
hi = 0;
}
Como puede ver, el constructor de la estructura Decimal copia el argumento del método en una variable local en lugar de usarlo directamente. Me preguntaba qué significa el comentario y cómo se relaciona con el rendimiento y la optimización.
Supongo que una vez que quiera modificar el argumento existente, ¿el método ya no estará en línea?
http://referencesource.microsoft.com/#mscorlib/system/decimal.cs#f9a4da9d6e110054#references
Supongo que una vez que
quieramodificar el argumento existente, ¿el método ya no estará en línea?
Respuesta corta: su suposición es correcta (si el comentario del código fuente sigue siendo cierto hoy).
// JIT today can''t inline methods that contains "starg" opcode.
"The JIT" es la parte del tiempo de ejecución de .NET que traduce el lenguaje intermedio (IL) (es decir, "bytecode" de .NET) al lenguaje ensamblador de su computadora. Solo entonces su computadora puede ejecutar el código. El JIT realiza esta traducción método por método, y solo cuando realmente se necesita: siempre que se invoca por primera vez un método, primero se compila hasta el lenguaje ensamblador actual, "just-in-time" (JIT).
El compilador de C # no genera lenguaje ensamblador para la arquitectura de su computadora de inmediato; en cambio, genera lenguaje intermedio , que es algún tipo de lenguaje ensamblador para una máquina de pila abstracta (que se definió en el estándar internacional ECMA 334 ).
Por ejemplo, las asignaciones a un parámetro (en su ejemplo: value
) serían traducidas por el compilador C # a una instrucción IL llamada starg
("almacenar en argumento").
El comentario básicamente dice que si el método contuviera dicha asignación ( value = …
), entonces el JIT no podría "en línea" en ese momento. "Inlinear un método" significa que en lugar de generar instrucciones de llamada a un método (es decir, derivar comandos a una ubicación de código diferente), el JIT en su lugar inserta el cuerpo completo del método en el lugar donde se lo llama. Por lo general, esto se hace para optimizar la velocidad de ejecución, ya que no es necesario realizar ninguna bifurcación / salto, y, además, asumo que no se debe configurar ningún nuevo marco de pila.
value_copy = …
a una variable local en su lugar ( value_copy = …
), se value_copy = …
esta limitación del JIT, porque las asignaciones a las variables locales provocan que se genere una instrucción IL diferente: stloc
("almacenar en variable local").
Ver también:
- Andrey Akinshin: "Una historia sobre JIT-x86 en línea y starg" (entrada de blog)