Я тестировал производительность трассировщика 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% быстрее?