Tôi biết rằng 'vượt qua các ranh giới' khi thực hiện cuộc gọi JNI trong Java là chậm.
Tuy nhiên tôi muốn biết cái gì làm cho nó chậm? Việc triển khai jvm cơ bản làm gì khi thực hiện cuộc gọi JNI khiến nó quá chậm?
Tôi biết rằng 'vượt qua các ranh giới' khi thực hiện cuộc gọi JNI trong Java là chậm.
Tuy nhiên tôi muốn biết cái gì làm cho nó chậm? Việc triển khai jvm cơ bản làm gì khi thực hiện cuộc gọi JNI khiến nó quá chậm?
Câu trả lời:
Đầu tiên, đáng chú ý là "chậm", chúng ta đang nói về thứ gì đó có thể mất hàng chục nano giây. Đối với các phương thức gốc không quan trọng, năm 2010 tôi đã đo các cuộc gọi ở mức trung bình 40 ns trên máy tính để bàn Windows của tôi và 11 ns trên máy tính để bàn Mac của tôi. Trừ khi bạn thực hiện nhiều cuộc gọi, bạn sẽ không chú ý.
Điều đó nói rằng, việc gọi một phương thức riêng có thể chậm hơn so với thực hiện một cuộc gọi phương thức Java thông thường. Nguyên nhân bao gồm:
Một số thảo luận bổ sung, có thể là ngày, có thể được tìm thấy trong "Hiệu suất nền tảng Java: Chiến lược và chiến thuật", 2000, bởi Steve Wilson và Jeff Kesselman, trong phần "9.2: Kiểm tra chi phí JNI". Đó là khoảng một phần ba của trang này , được cung cấp trong bình luận của @Philip bên dưới.
Bài viết trên IBM 2009 "Các cách thực hành tốt nhất để sử dụng Giao diện gốc Java" cung cấp một số gợi ý về cách tránh các cạm bẫy hiệu năng với JNI.
sun.misc.Unsafe
và khá nhiều thứ khác như System.currentTimeMillis/nanoTime
được xử lý thông qua 'ma thuật' bởi JVM. Chúng không phải là JNI và chúng hoàn toàn không có các tệp .c / .h phù hợp, tự nó ẩn hàm JVM. Cách tiếp cận không thể được theo sau trừ khi bạn đang viết / hack JVM.
Điều đáng nói là không phải tất cả các phương thức Java được đánh dấu native
là "chậm". Một số trong số họ là nội tại làm cho họ cực kỳ nhanh chóng. Để kiểm tra xem cái nào là nội tại và cái nào không, bạn có thể tìm do_intrinsic
tại vmSymbols.hpp .
Về cơ bản, JVM xây dựng một cách diễn giải các tham số C cho mỗi lệnh gọi JNI và mã không được tối ưu hóa.
Có nhiều chi tiết được nêu trong bài báo này
Nếu bạn quan tâm đến điểm chuẩn JNI so với mã gốc , dự án này có mã để chạy điểm chuẩn.