Questo Java method si abitua nei benchmark per simulare lento calcolo:Perché questo metodo non viene ottimizzato?
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i++) {
result += i;
}
return result;
}
Questo è IMHO una pessima idea, come il suo corpo può ottenere sostituito da return 500500
. Questo sembra non accadere mai; probabilmente a causa di tale ottimizzazione è irrilevante per il codice reale come Jon Skeet ha dichiarato.
È interessante notare che un metodo leggermente più semplice con result += 1;
viene completamente ottimizzato (caliper riporta 0,460543 ns).
Ma anche quando siamo d'accordo che l'ottimizzazione di distanza metodi ritornano un risultato costante è inutile per il codice vero e proprio, c'è ancora svolgimento del ciclo, che potrebbe portare a qualcosa di simile
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i += 2) {
result += 2 * i + 1;
}
return result;
}
Quindi la mia domanda rimane: perché c'è l'ottimizzazione eseguito qui?
Contrariamente a quanto ho scritto in origine; Devo aver visto qualcosa che non c'era.
Come hai fatto a testare questo? Se utilizzi il JIT, probabilmente osserverai cose simili cambiando leggermente il codice, poiché sono coinvolte molte euristiche. Non è assolutamente garantito che il JIT applichi anche le ottimizzazioni più semplici come l'inlining, poiché lo fa solo una volta ritenuto necessario. –
È questo codice reale? Se sai cosa significa tornare, perché non scrivere il codice in questo modo? Sono contento che i compilatori JIT sono sintonizzati per ottimizzare * codice reale * piuttosto che ottimizzare il codice di distanza che non si verificherebbe nella realtà. (Gli ottimizzatori statici hanno un margine di manovra un po 'maggiore, ma ricorda che ogni ottimizzazione che un compilatore JIT cerca di trovare ha un costo in fase di esecuzione *.) –
@JonSkeet: osservo, imbarazzantemente, che il collegamento indirizza al codice di benchmarking di Guava, che Normalmente spero di fidarmi ... –