Saya tahu bahwa 'melewati batas' ketika melakukan panggilan JNI di Jawa lambat.
Namun saya ingin tahu apa yang membuatnya lambat? Apa yang dilakukan implementasi jvm yang mendasari ketika membuat panggilan JNI yang membuatnya sangat lambat?
Saya tahu bahwa 'melewati batas' ketika melakukan panggilan JNI di Jawa lambat.
Namun saya ingin tahu apa yang membuatnya lambat? Apa yang dilakukan implementasi jvm yang mendasari ketika membuat panggilan JNI yang membuatnya sangat lambat?
Jawaban:
Pertama, perlu dicatat bahwa dengan "lambat," kita berbicara tentang sesuatu yang bisa memakan waktu puluhan nanodetik. Untuk metode asli sepele, pada tahun 2010 saya mengukur panggilan pada rata-rata 40 ns pada desktop Windows saya, dan 11 ns pada desktop Mac saya. Kecuali Anda melakukan banyak panggilan, Anda tidak akan menyadarinya.
Yang mengatakan, memanggil metode asli bisa lebih lambat daripada membuat panggilan metode Java normal. Penyebab meliputi:
Beberapa diskusi tambahan, mungkin tanggal, dapat ditemukan di "Kinerja Platform Java: Strategi dan Taktik", 2000, oleh Steve Wilson dan Jeff Kesselman, di bagian "9.2: Memeriksa biaya JNI". Sekitar sepertiga dari jalan ke bawah halaman ini , disediakan dalam komentar oleh @ Philip di bawah
Makalah IBM developerWorks 2009 "Praktik terbaik untuk menggunakan Java Native Interface" memberikan beberapa saran untuk menghindari jebakan kinerja dengan JNI.
sun.misc.Unsafe
dan cukup banyak hal-hal lain seperti System.currentTimeMillis/nanoTime
ditangani melalui 'sihir' oleh JVM. Mereka bukan JNI dan mereka tidak memiliki file .c / .h yang tepat sama sekali, kecuali JVM impl, itu sendiri. Pendekatan tidak dapat diikuti kecuali Anda menulis / meretas JVM.
Perlu disebutkan bahwa tidak semua metode Java yang ditandai dengan native
"lambat". Beberapa dari mereka adalah intrinsik yang membuatnya sangat cepat. Untuk memeriksa mana yang intrinsik dan mana yang tidak, Anda dapat mencari do_intrinsic
di vmSymbols.hpp .
Pada dasarnya JVM secara interpretatif membuat parameter C untuk setiap panggilan JNI dan kode tidak dioptimalkan.
Ada banyak detail lainnya yang diuraikan dalam makalah ini
Jika Anda tertarik untuk membandingkan JNI vs kode asli , proyek ini memiliki kode untuk menjalankan benchmark.