2013-07-17 10 views
5

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?

+2

In generale, non si dovrebbe sperare nell'ottimizzazione del compilatore – oakio

risposta

3

Questo è il tipo di ottimizzazione previsto in un compilatore C o C++. In realtà è piuttosto attuale, questa ottimizzazione esatta è stata menzionata in this video di una sessione di Build 2013. Mentre è indirizzato ai programmatori C/C++, molto è coperto ciò che è interessante anche per i programmatori C#. I vincoli del sottosistema di memoria sono ugualmente rilevanti. Non sono sicuro che se l'ottimizzazione lo ha fatto in VS2013, iirc ha avuto un problema rallentando troppo il compilatore nativo.

Ma no, il jitter optimizer funziona con un budget molto ristretto. Trascorrere troppo tempo causa ritardi di avvio e pause di esecuzione notevoli, quindi non può permettersi questo tipo di analisi. I programmatori C# devono farlo da soli.

+0

Il video è affascinante; grazie per il collegamento ad esso. Ho l'impressione, tuttavia, che il gruppo di sviluppo del compilatore C# non sia abbastanza integrato con il gruppo di sviluppo C/C++ per assicurarci che tali ottimizzazioni siano nella pipeline. Saresti d'accordo? –

Problemi correlati