Ottimizzazione della moltiplicazione .NET
-
03-07-2019 - |
Domanda
Il compilatore ottimizza eventuali moltiplicazioni per 1? Cioè, considera:
int a = 1;
int b = 5 * a;
L'espressione 5 * a sarà ottimizzata in soli 5? In caso contrario, lo farà se a è definito come:
const int a = 1;
Soluzione
Precalcolerà eventuali espressioni costanti durante la compilazione, inclusa la concatenazione di stringhe. Senza il const
rimarrà solo.
Il tuo primo esempio viene compilato in questo 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
Il secondo esempio viene compilato in questo modo:
.maxstack 1
.locals init ( [0] int32 )
ldc.i4.5 //load 5
stloc.0 //store in local variable
Altri suggerimenti
La propagazione costante è una delle ottimizzazioni più comuni e più semplici.
Guardando il codice generato dal compilatore mono, la versione con la non const a esegue la moltiplicazione in fase di esecuzione. Cioè, la moltiplicazione non è ottimizzata. Se si effettua una const, la moltiplicazione viene ottimizzata.
Il compilatore Microsoft potrebbe avere un compilatore più aggressivo, la soluzione migliore è guardare il codice generato dal compilatore per vedere cosa sta facendo.
Ciò che il compilatore dovrebbe ottimizzare qui non è la moltiplicazione per 1 di per sé, ma piuttosto l'aritmetica con valori noti in fase di compilazione. Quindi sì, un compilatore ottimizzerebbe tutti i calcoli nel tuo esempio, con o senza la const
.
Modifica: un compilatore competente , dovrei dire.