Java: Получатель и установщик быстрее, чем прямой доступ?

Я проверил производительность трассировщика лучей Java, над которым я пишу VisualVM 1.3.7 на моем нетбуке с Linux. Я измерял с помощью профилировщика.
Для забавы я проверил, есть ли разница между использованием геттеров и сеттеров и непосредственным доступом к полям. Получатели и установщики являются стандартным кодом без добавления.

Я не ожидал никаких отличий. Но код прямого доступа был медленнее.

Вот пример, который я тестировал в Vector3D:

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

Время: 1542 мс / 1 000 000 вызовов

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

Время: 1453 мс / 1 000 000 вызовов

Я тестировал не в микро-тестах, а в трассировщике лучей. То, как я тестировал код:

Я запустил программу с первым кодом и настроил его. Трассировщик лучей еще не работает. Я запустил профилировщик и немного подождал после завершения инициализации. Я запустил трассировщик лучей. Когда VisualVM показал достаточно вызовов, я остановил профилировщик и немного подождал. Я закрыл программу трассировки лучей. Я заменил первый код на второй и повторил вышеописанные шаги после компиляции.

Я выполнил как минимум 20 000 000 вызовов для обоих кодов. Я закрыл любую программу, которая мне не нужна. Я установил производительность своего ЦП, поэтому его тактовая частота была максимальной. все время
Как это возможно, что второй код на 6% быстрее?

Ответы на вопрос(3)

Ваш ответ на вопрос