Почему вызов 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, чтобы он ввел машинный код.