Java'da JNI çağrısı yaparken 'sınırları aşmanın' yavaş olduğunu biliyorum.
Ancak yavaşlatan ne olduğunu bilmek istiyorum. Altta yatan jvm uygulaması, onu yavaşlatan bir JNI çağrısı yaparken ne yapar?
Java'da JNI çağrısı yaparken 'sınırları aşmanın' yavaş olduğunu biliyorum.
Ancak yavaşlatan ne olduğunu bilmek istiyorum. Altta yatan jvm uygulaması, onu yavaşlatan bir JNI çağrısı yaparken ne yapar?
Yanıtlar:
İlk olarak, "yavaş" ile onlarca nanosaniye alabilecek bir şeyden bahsettiğimizi belirtmek gerekir. Önemsiz yerel yöntemler için, 2010 yılında Windows masaüstümde ortalama 40 ns ve Mac masaüstümde 11 ns çağrıları ölçtüm. Çok fazla çağrı yapmadığınız sürece fark etmeyeceksiniz.
Bununla birlikte, yerel bir yöntemi çağırmak normal bir Java yöntemi çağrısı yapmaktan daha yavaş olabilir . Nedenleri şunları içerir:
Muhtemelen tarihli bazı ek tartışmalar "9.2: JNI maliyetlerinin incelenmesi" bölümünde Steve Wilson ve Jeff Kesselman tarafından "Java® Platform Performansı: Stratejiler ve Taktikler", 2000'de bulunabilir. Aşağıdaki @Philip tarafından yapılan yorumda bu sayfanın aşağıya üçte biri kadar .
2009 IBM developerWorks makalesi "Java Native Interface'i kullanmak için en iyi uygulamalar" , JNI ile performans tuzaklarından kaçınmak için bazı öneriler sunar.
sun.misc.Unsafe
ve diğer pek çok şey System.currentTimeMillis/nanoTime
JVM tarafından 'sihir' ile ele alınır. Onlar JNI değildir ve JVM impl, kendisini barikat, uygun .c / .h dosyaları hiç yok. JVM'yi yazma / hacklemediğiniz sürece yaklaşım takip edilemez.
İşaretli tüm Java yöntemlerinin native
"yavaş" olmadığını belirtmek gerekir . Bunlardan bazıları şunlardır intrinsics son derece hızlı onları yapar. İçsel ve hangilerinin ise kötü, arayıp bulabileceğiniz hangilerinin kontrol etmek do_intrinsic
de vmSymbols.hpp .
Temel olarak JVM, her JNI çağrısı için C parametrelerini yorumlamalı olarak oluşturur ve kod optimize edilmez.
Bu makalede ana hatlarıyla belirtilen daha fazla ayrıntı var
Kıyaslama JNI vs yerel kod ile ilgileniyorsanız, bu proje karşılaştırmalı değerlendirme kodu vardır.