Java: Getter e setter mais rápido que o acesso diret

Testei o desempenho de um traçador de raios Java em que estou escrevendo VisualVM 1.3.7 no meu Netbook Linux. Eu medi com o criador de perfil.
or diversão, testei se há uma diferença entre usar getters e setters e acessar os campos diretamente. Os getters e setters são código padrão sem adição.

Eu não esperava diferenças. Mas o código de acesso direto era mais lento.

Aqui está a amostra que testei no Vector3D:

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

Time: 1542 ms / 1.000.000 invocações

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

Time: 1453 ms / 1.000.000 invocações

Não testei em um micro-benchmark, mas no ray tracer. A maneira como testei o código:

Iniciei o programa com o primeiro código e o configurei. O traçador de raios ainda não está funcionando.Iniciei o criador de perfil e esperei um pouco após a inicializaçã Comecei um traçador de raios.uando o VisualVM mostrou chamadas suficientes, parei o criador de perfil e esperei um poucFechei o programa traçador de raio Substituí o primeiro código pelo segundo e repeti as etapas acima após a compilaçã

Executei pelo menos 20.000.000 invocações para ambos os códigos. Fechei qualquer programa que não precisava. Defino minha CPU no desempenho, para que o relógio da CPU estivesse no máximo. o tempo todo
Como é possível que o segundo código seja 6% mais rápido?

questionAnswers(3)

yourAnswerToTheQuestion