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?