Se something.awesome è un campo è probabile che sia l'accesso ogni volta intorno al ciclo poiché qualcosa nel corpo del ciclo può aggiornarlo. Se il corpo del loop è abbastanza semplice e non richiama alcun metodo (a parte i metodi del compilatore inline), allora il compilatore può essere in grado di dimostrare che è sicuro inserire il valore di something.awesome in un registro. Gli scrittori di compilatori erano soliti permettersi di fare questo poco.
Tuttavia in questi giorni è necessario molto tempo per accedere a un valore dalla memoria principale, ma una volta che il valore è stato letto per la prima volta, viene istruito dalla CPU. Leggere il valore per una seconda volta dalla cache della CPU è molto più veloce nella lettura di un registro, quindi leggerlo dalla memoria principale. Non è raro che una cache della CPU sia centinaia di volte più veloce della memoria principale.
Ora se something.awesome è una proprietà , quindi è in effetti una chiamata di metodo. Il compilatore chiamerà il metodo ogni volta intorno al ciclo. Tuttavia se la proprietà/metodo è solo poche righe di codice, potrebbe essere in linea dal compilatore. Inlineing è quando il compilatore inserisce una copia del codice del metodo direttamente anziché chiamare il metodo, quindi una proprietà che restituisce semplicemente il valore di un campo si comporterà come nell'esempio di campo sopra riportato.
Evan quando la proprietà non è in linea, sarà nella cache della CPU dopo che è stata chiamata la prima volta. Quindi le ales sono molto complesse o il ciclo gira un sacco di volte richiede molto più tempo per chiamare la prima volta, forse più di un fattore 10.
Nei vecchi giorni, era facile da usare perché tutte le operazioni di accesso alla memoria e cpu sono state eseguite nello stesso periodo. In questi giorni la cache del processore può facilmente modificare i tempi per alcuni accessi di memoria e chiamate di metodi da su un fattore di 100. I profiler tendono a supporre che tutti gli accessi alla memoria abbiano lo stesso tempo! Quindi se il tuo profilo ti verrà detto di apportare modifiche che potrebbero non avere alcun effetto nel mondo reale.
Modifica del codice a:
int limit = something.awesome;
for(int i = 0; i < limit; i++)
{
// Do cool stuff
}
Will in alcuni casi sparsi in su, ma rende anche più complesso. Tuttavia
int limit = myArray.length;
for(int i = 0; i < limit; i++)
{
myArray[i[ = xyn;
}
è più lento quindi
for(int i = 0; i < myArray.length; i++)
{
myArray[i[ = xyn;
}
esempio .net controllare la vincolato di array ogni volta che si accede e hanno logica per rimuovere il controllo quando il ciclo è abbastanza semplice.
Quindi è meglio mantenere il codice semplice e chiaro finché non si può dimostrare che c'è un problema. Guadagni molto meglio spendendo il tuo tempo migliorando la progettazione generale di un sistema, questo è facile da fare se il codice che inizi con è semplice.
Bene, provalo con 'for (int i = 0; i <(i + 2); ++ i)';) – Dario
Solo un accantonamento; ci * è * uno scenario in cui il JIT fa qualcosa di intelligente qui; con gli array individua il caso comune di
Hmm, in realtà non mi fido molto del JIT da quando sto sviluppando in XNA, che è un po 'bizzarro nel 360. Non essendo poco intuitivo, potrebbe rivelarsi utile per le app per PC. :) – Vectovox