Почему вызов JNI для метода native медленнее, чем аналогичный в sun.misc.Unsafe

Я разрабатываю реализацию JNI, аналогичную sun.misc.Unsafe, но с расширенным управлением памятью.

Как объяснить, что время вызова собственных методов из sun.misc.Unsafe и из моей разработанной библиотеки чрезвычайно отличается?

Некоторые номера: sun.misc.Unsafe.getInt(адрес) занимает ~ 1ns когда мой подобный метод принимает ~ 10ns

Обе реализации совершенно одинаковы, следуя исходному коду openJDK, просто верните переменную указателем. Небезопасно в модуле JNI, зарегистрированное таким же образом, как и другое.

Как ускорить вызов JNI? Что делает Unsafe настолько особенным для производительности?

Спасибо, Юрий/

Ответ 1

Если вы ищете источник собственных методов в классе Unsafe, вы обнаружите, что не реализованы JNI. Вместо этого небезопасные методы встроены как машинный код. getInt(long), например, становится одной машинной инструкцией.

По этой причине вы не можете написать JNI-метод, который работает так же быстро, как использование Unsafe, без изменения JVM, чтобы он ввел машинный код.