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?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage