Почему JNI вызывает нативный метод медленнее, чем аналогичный в sun.misc.Unsafe - PullRequest
7 голосов
/ 19 октября 2011

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

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

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

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

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

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

1 Ответ

9 голосов
/ 19 октября 2011

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

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

...