Questa domanda è identica a questa Two loop bodies or one (result identical) ma nel mio caso, io uso Java.Due operazioni in un ciclo contro due cicli che eseguono le stesse operazioni una per ciclo
Ho due cicli che funzionano un miliardo di volte.
int a = 188, b = 144, aMax = 0, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a^i;
if (t > aMax)
aMax = t;
}
for (int i = 0; i < 1000000000; i++) {
int t = b^i;
if (t > bMax)
bMax = t;
}
Il tempo necessario per eseguire questi due cicli nella mia macchina è di circa 4 secondi. Quando unisco questi due loop in un unico loop e eseguo tutte le operazioni in quel loop singolo, viene eseguito in 2 secondi. Come puoi vedere operazioni banali compongono il contenuto del loop, richiedendo quindi un tempo costante.
La mia domanda è dove sto ottenendo questo miglioramento delle prestazioni?
sto indovinando che l'unico luogo possibile dove la prestazione viene colpito nei due cicli separati è che incrementa i e controlla se i < 1000000000 2 miliardi di volte contro solo 1 miliardo di volte se mi si fondono insieme i loop. C'è qualcos'altro che succede lì dentro?
Grazie!
vorrei assumere è perché si sta facendo 1B altri incrementi, 1B più confronti, e 1B più salti ... – verdesmarald
Qual è l'effetto dello spostamento della dichiarazione 'int t; 'al di fuori del/i ciclo/i e facendo semplicemente assegnamento' t = a^i; 'o' t = b^i; 'all'interno del/i ciclo/i? – barrowc
@barrowc non avrebbe alcun effetto. Una delle prime fasi del JIT è quella di convertire il grafico AST in una singola rappresentazione di assegnamento, che annullerebbe questo aliasing per una migliore analisi del ciclo di vita. – ddimitrov