consideri il seguente frammento di codice, un attraversamento di tre array bidimensionale di singoli, in termini di efficienza di esecuzione, supponendo che process1()
e process2()
prendono stessa lunghezza di tempo per eseguire:Compilatore .NET - Sono incorporate le ottimizzazioni di loop annidate?
float arr[mMax,nMax,oMax];
for (m = 0; m < mMax; m++)
for (n = 0; n < nMax; n++)
for (o = 0; o < oMax; o++)
{ process1(arr[m,n,o]); }
for (o = 0; o < oMax; o++)
for (n = 0; n < nMax; n++)
for (m = 0; m < mMax; m++)
{ process2(arr[m,n,o]); }
Ora, è noto che C# organizza gli array nel framework .NET come strutture a riga maggiore. Senza alcuna ottimizzazione presumerei che il primo ciclo verrà eseguito molto più velocemente del secondo.
La domanda è: I compilatori JIT o Cs.exe/vb.exe del CLR rilevano e ottimizzano i loop come questo, forse riordinando il nesting, o dovrei sempre stare in guardia per i potenziali colpi di performance, specialmente in termini di cosa potrebbe accadere se provassi a parallelizzare i loop?
In generale, non si dovrebbe sperare nell'ottimizzazione del compilatore – oakio