Ten Java method przyzwyczaja się odniesienia do symulowania powolnego obliczeń:Dlaczego ta metoda nie jest zoptymalizowana?
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i++) {
result += i;
}
return result;
}
To IMHO bardzo zły pomysł, ponieważ jego organizm może się wyrazami return 500500
. To wydaje się nigdy nie zdarzyć; prawdopodobnie dlatego, że taka optymalizacja jest nieistotna dla prawdziwego kodu, jak stwierdził Jon Skeet.
Co ciekawe, nieco prostsza metoda z result += 1;
zostaje całkowicie zoptymalizowana (raport z suwakiem 0,460543).
Ale nawet jeśli zgodzimy się, że optymalizacja dala metod powracających stałą wynik jest bezużyteczny dla prawdziwego kodu, jest jeszcze rozwijanie pętli, które mogłyby prowadzić do czegoś jak
static int slowItDown() {
int result = 0;
for (int i = 1; i <= 1000; i += 2) {
result += 2 * i + 1;
}
return result;
}
Więc moje pytanie pozostaje: dlaczego ma optymalizacja występował tutaj?
Wbrew temu, co napisałem pierwotnie; Musiałem zobaczyć coś, czego nie było.
Jak to sprawdzić? Jeśli korzystasz z JIT, prawdopodobnie zauważysz podobne rzeczy, nieznacznie zmieniając kod, ponieważ w grę wchodzi wiele heurystyk. Nie masz gwarancji, że JIT zastosuje nawet najprostsze optymalizacje, takie jak inline, ponieważ robi to tylko raz, gdy uzna to za konieczne. –
Czy to jest prawdziwy kod? Jeśli wiesz, co ma powrócić, dlaczego nie napisać kodu w ten sposób? Cieszę się, że kompilatory JIT zostały zoptymalizowane pod kątem * prawdziwego * kodu, zamiast optymalizacji kodu, który nie pojawiłby się w rzeczywistości. (Optymalizatory statyczne mają nieco większą swobodę niż to, ale pamiętaj, że każda optymalizacja, którą próbuje znaleźć kompilator JIT, wiąże się z kosztem w czasie wykonywania *.) –
@ JonSkeet: Zauważam, zawstydzająco, że link kieruje do kodu testu porównawczego Guava, który Normalnie mam nadzieję zaufać ... –