2008-10-02 10 views
6

¿El compilador optimiza las multiplicaciones en 1? Es decir, considere:.NET multiplication optimization

int a = 1; 
int b = 5 * a; 

¿La expresión 5 * a se optimizará en solo 5? Si no, si A se define como:

const int a = 1; 

Respuesta

13

Se comprobará la validez de cualquier cálculo de expresiones constantes cuando se compila, incluyendo la concatenación de cadenas. Sin el const, se lo dejará solo.

Su primer ejemplo compila a esta IL:

.maxstack 2 
.locals init ([0] int32, [1] int32) 

ldc.i4.1 //load 1 
stloc.0 //store in 1st local variable 
ldc.i4.5 //load 5 
ldloc.0 //load 1st variable 
mul  // 1 * 5 
stloc.1 // store in 2nd local variable 

El segundo ejemplo compila a esto:

.maxstack 1 
.locals init ([0] int32) 

ldc.i4.5 //load 5 
stloc.0 //store in local variable 
+0

Incluso sin la const, un compilador competente sabrá que 'a' no cambia entre ser asignado y ser utilizado. –

+0

Un compilador competente puede suponer eso, pero no puede saber si, por algún motivo, insertar un int en la pila evitará que se cargue en una variable local. –

+0

¿Eso fue con o sin optimización? –

1

constante de propagación es una de las optimizaciones más fáciles más común y.

0

Lo que el compilador optimizaría aquí no es la multiplicación por 1 per-se, sino la aritmética con valores conocidos en tiempo de compilación. Así que sí, un compilador optimizaría todas las matemáticas en su ejemplo, con o sin el const.

Editar: A competente compilador, debo decir.

+0

Lo compilé y desensamblé y no optimizó la expresión no const. –

+0

¿Es posible que el JIT lo optimice en tiempo de ejecución? –

+0

@Neil Williams: Es de esperar, pero el JIT no es realmente el lugar para descubrir cosas que podrías haber descubierto en tiempo de compilación. –

1

Al observar el código generado por el compilador mono, la versión con el non-const a realiza la multiplicación en tiempo de ejecución. Es decir, la multiplicación no está optimizada. Si haces una const, entonces la multiplicación se optimiza.

El compilador de Microsoft puede tener un compilador más agresivo, la mejor solución es mirar el código generado por el compilador para ver lo que está haciendo.