Java: ¿Getter y setter más rápido que el acceso directo?

Probé el rendimiento de un rastreador de rayos Java en el que estoy escribiendo con VisualVM 1.3.7 en mi Netbook Linux. Medí con el perfilador.
Por diversión, probé si hay una diferencia entre usar getters y setters y acceder a los campos directamente. Los captadores y establecedores son códigos estándar sin adición.

No esperaba ninguna diferencia. Pero el código de acceso directo fue más lento.

Aquí está la muestra que probé en Vector3D:

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

Time: 1542 ms / 1,000,000 invocaciones

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

Time: 1453 ms / 1,000,000 invocaciones

No lo probé en un micro-punto de referencia, sino en el rastreador de rayos. La forma en que probé el código:

Inicié el programa con el primer código y lo configuré. El rastreador de rayos aún no se está ejecutando.Inicié el generador de perfiles y esperé un poco después de que se realizó la inicialización.Inicié un rastreador.Cuando VisualVM mostró suficientes invocaciones, detuve el generador de perfiles y esperé un poco. Cerré el programa de trazado de rayos. Reemplacé el primer código con el segundo y repetí los pasos anteriores después de compilar.

Al menos ejecuté 20,000,000 invocaciones para ambos códigos. Cerré cualquier programa que no necesitaba. Configuré mi CPU en el rendimiento, por lo que mi reloj de la CPU estaba en el máximo. todo el tiempo
¿Cómo es posible que el segundo código sea un 6% más rápido?

Respuestas a la pregunta(3)

Su respuesta a la pregunta