是的,這種優化被稱爲loop invariant hoisting,以及熱點JVM肯定can do this。
我們可以通過一個簡單的JMH基準來驗證這一點。
package bench;
import org.openjdk.jmh.annotations.*;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@State(Scope.Benchmark)
public class Listeners {
List<Listener> listOfListeners = IntStream.range(0, 50)
.mapToObj(Listener::new)
.collect(Collectors.toList());
Object[] arguments = {Math.random()};
@Benchmark
public void inside() {
for (Listener listener : listOfListeners) {
listener.apply(((Double) arguments[0]).longValue());
}
}
@Benchmark
public void outside() {
long id = ((Double) arguments[0]).longValue();
for (Listener listener : listOfListeners) {
listener.apply(id);
}
}
static class Listener {
private long sum;
Listener(int initialValue) {
this.sum = initialValue;
}
public void apply(long id) {
sum += id;
}
}
}
結果表明,無論是inside
和outside
方法是在性能方面的平等。
Benchmark Mode Cnt Score Error Units
Listeners.inside avgt 10 53,354 ± 0,317 ns/op
Listeners.outside avgt 10 53,690 ± 0,373 ns/op
感謝您的幫助:) – Kode