Я знаю, що "перетинання кордонів" під час здійснення дзвінка JNI на Яві відбувається повільно.
Однак я хочу знати, що це робить це повільним? Що робить основна реалізація jvm при здійсненні виклику JNI, що робить його настільки повільним?
Я знаю, що "перетинання кордонів" під час здійснення дзвінка JNI на Яві відбувається повільно.
Однак я хочу знати, що це робить це повільним? Що робить основна реалізація jvm при здійсненні виклику JNI, що робить його настільки повільним?
Відповіді:
По-перше, варто зазначити, що "повільно" ми говоримо про те, що може зайняти десятки наносекунд. Для тривіальних нативних методів я в 2010 році вимірював дзвінки в середньому 40 нс на робочому столі Windows і 11 нс на робочому столі Mac. Якщо ви не робите багато дзвінків, ви не збираєтеся повідомлення.
Однак, виклик власного методу може бути повільніше, ніж звичайний виклик методу Java. Причини включають:
Деякі додаткові дискусії, можливо, датовані, можна знайти у "Ефективність платформи Java¿: Стратегії та тактика", 2000 р. Стів Вілсон та Джефф Кессельман, в розділі "9.2: Вивчення витрат на JNI". Це приблизно третина шляху вниз по цій сторінці , наведеному в коментарі @Philip нижче.
У документі IBM developerWorks 2009 року «Найкращі практики використання інтерфейсу Java Native» наведено кілька пропозицій щодо уникнення підводних процесів з використанням JNI.
sun.misc.Unsafe
і дуже багато інших подібних речей System.currentTimeMillis/nanoTime
, якими керує JVM за допомогою "магії". Вони не JNI, і вони взагалі не мають належних файлів .c / .h, що забороняє імпульс JVM. Підходу не можна дотримуватися, якщо ви не пишете / не рубаєте JVM.
Варто зазначити, що не всі методи Java, позначені символом, native
є "повільними". Деякі з них є властивими, що робить їх надзвичайно швидкими. Щоб перевірити, які з них є внутрішніми, а які - не, ви можете подивитися do_intrinsic
на vmSymbols.hpp .
В основному JVM інтерпретативно будує параметри С для кожного дзвінка JNI, і код не оптимізований.
У цій роботі викладено ще багато деталей
Якщо вас цікавить тестування JNI проти нативного коду, цей проект має код для запуску тестів.