Java: Getter und Setter schneller als Direktzugriff?

Ich habe die Leistung eines Java Ray Tracers getestet, auf dem ich schreibe mit VisualVM 1.3.7 auf meinem Linux Netbook. Ich habe mit dem Profiler gemessen.
Zum Spaß habe ich getestet, ob es einen Unterschied zwischen der Verwendung von Gettern und Setzern und dem direkten Zugriff auf die Felder gibt. Die Getter und Setter sind Standardcodes ohne Zusatz.

Ich habe keine Unterschiede erwartet. Aber der direkt zugreifende Code war langsamer.

Hier ist das Beispiel, das ich in Vector3D getestet habe:

public float dot(Vector3D other) {
    return x * other.x + y * other.y + z * other.z;
}

Zeit: 1542 ms / 1.000.000 Aufrufe

public float dot(Vector3D other) {
    return getX() * other.getX() + getY() * other.getY() + getZ() * other.getZ();
}

Zeit: 1453 ms / 1.000.000 Aufrufe

Ich habe es nicht in einem Mikro-Benchmark getestet, sondern im Ray Tracer. So habe ich den Code getestet:

Ich habe das Programm mit dem ersten Code gestartet und eingerichtet. Der Ray Tracer läuft noch nicht.Ich habe den Profiler gestartet und nach Abschluss der Initialisierung eine Weile gewartet.Ich habe einen Ray Tracer gestartet.Wenn VisualVM genügend Aufrufe anzeigt, stoppte ich den Profiler und wartete ein bisschen.Ich habe das Ray Tracer-Programm geschlossen.Ich habe den ersten Code durch den zweiten ersetzt und die obigen Schritte nach dem Kompilieren wiederholt.

Ich habe mindestens 20.000.000 Aufrufe für beide Codes ausgeführt. Ich habe jedes Programm geschlossen, das ich nicht brauchte. Ich stellte meine CPU auf Leistung ein, also war meine CPU-Taktung auf max. die ganze Zeit
Wie ist es möglich, dass der zweite Code 6% schneller ist?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage