Optimisation de la multiplication .NET
-
03-07-2019 - |
Question
Le compilateur optimise-t-il les multiplications de 1? C'est-à-dire, considérez:
int a = 1;
int b = 5 * a;
L’expression 5 * a sera-t-elle optimisée à seulement 5? Si ce n'est pas le cas, est-ce que a est défini comme suit:
const int a = 1;
La solution
Il calculera au préalable toutes les expressions constantes lors de la compilation, y compris la concaténation de chaînes. Sans const
, il sera laissé seul.
Votre premier exemple compile sur cet 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
Le deuxième exemple est compilé comme suit:
.maxstack 1
.locals init ( [0] int32 )
ldc.i4.5 //load 5
stloc.0 //store in local variable
Autres conseils
La propagation constante est l’une des optimisations les plus courantes et les plus faciles.
En regardant le code généré par le compilateur mono, la version avec le non-const a effectue la multiplication au moment de l'exécution. C'est-à-dire que la multiplication n'est pas optimisée. Si vous faites un const, alors la multiplication est optimisée.
Le compilateur Microsoft pourrait avoir un compilateur plus agressif, la meilleure solution consiste à consulter le code généré par le compilateur pour voir ce qu'il fait.
Ce que le compilateur optimiserait ici, ce n’est pas une multiplication par 1, mais plutôt une arithmétique avec des valeurs connues au moment de la compilation. Alors oui, un compilateur optimiserait tous les calculs de votre exemple, avec ou sans const
.
Modifier: Un compilateur compétent , devrais-je dire.