Verstehen der Schleifenleistung in jvm
Ich spiele mitjmh
und im Abschnitt über looping Sie sagten, das
Je höher die Anzahl der Wiederholungen, desto geringer sind möglicherweise die "wahrgenommenen" Kosten der gemessenen Operation. Bis zu dem Punkt, an dem wir jede Addition mit 1/20 ns durchführen, weit über das hinaus, was Hardware tatsächlich kann. Das passiert, weilie Schleife ist stark ausgerol und die zu messende Operation ist von der Schleife gehisst. Moral: Verwenden Sie Loops nicht zu häufig, sondern verlassen Sie sich auf JMH, um die richtige Messung zu erzielen.
Ich habe es selbst versucht
@Benchmark
@OperationsPerInvocation(1)
public int measurewrong_1() {
return reps(1);
}
@Benchmark
@OperationsPerInvocation(1000)
public int measurewrong_1000() {
return reps(1000);
}
und das folgende Ergebnis erhalten:
Benchmark Mode Cnt Score Error Units
MyBenchmark.measurewrong_1 avgt 15 2.425 ± 0.137 ns/op
MyBenchmark.measurewrong_1000 avgt 15 0.036 ± 0.001 ns/op
Es zeigt in der Tat, dass dieMyBenchmark.measurewrong_1000
ist dramatisch schneller alsMyBenchmark.measurewrong_1
. Aber ich kann die Optimierung, die JVM durchführt, um diese Leistungsverbesserung zu erzielen, nicht wirklich verstehen.
Was bedeuten dieloop ist ausgerollt / pipelined?