मुझे पता है कि जावा में जेएनआई कॉल करते समय 'सीमाएँ पार करना' धीमा है।
हालाँकि मैं जानना चाहता हूं कि ऐसा क्या है जो इसे धीमा बनाता है? जेएनआई कॉल करते समय अंतर्निहित जेवीएम कार्यान्वयन क्या करता है जो इसे इतना धीमा बनाता है?
मुझे पता है कि जावा में जेएनआई कॉल करते समय 'सीमाएँ पार करना' धीमा है।
हालाँकि मैं जानना चाहता हूं कि ऐसा क्या है जो इसे धीमा बनाता है? जेएनआई कॉल करते समय अंतर्निहित जेवीएम कार्यान्वयन क्या करता है जो इसे इतना धीमा बनाता है?
जवाबों:
सबसे पहले, यह ध्यान देने योग्य है कि "धीमी गति से," हम कुछ ऐसी चीजों के बारे में बात कर रहे हैं जो दसियों नैनोसेकंड ले सकते हैं। तुच्छ देशी तरीकों के लिए, 2010 में मैंने अपने विंडोज डेस्कटॉप पर औसतन 40 ns और मेरे मैक डेस्कटॉप पर 11 ns पर कॉल को मापा। जब तक आप कई कॉल नहीं कर रहे हैं, आप नोटिस नहीं करेंगे।
उस ने कहा, एक सामान्य जावा विधि कॉल करने की तुलना में एक देशी विधि कॉलिंग धीमी हो सकती है । कारणों में शामिल हैं:
कुछ अतिरिक्त चर्चा, संभवतः दिनांकित, "जावा Performance प्लेटफॉर्म प्रदर्शन: रणनीतियाँ और रणनीति", 2000 में, स्टीव विल्सन और जेफ केसलमैन द्वारा, "9.2: एग्जामिनिंग जेएनआई कॉस्ट" में पाया जा सकता है। यह इस पृष्ठ के तीसरे भाग के बारे में है , जो नीचे @Philip द्वारा टिप्पणी में प्रदान किया गया है।
2009 आईबीएम डेवलपरवॉक पेपर "जावा नेटिव इंटरफ़ेस का उपयोग करने के लिए सर्वोत्तम अभ्यास" जेएनआई के साथ प्रदर्शन की गड़बड़ी से बचने के लिए कुछ सुझाव प्रदान करता है।
sun.misc.Unsafe
और System.currentTimeMillis/nanoTime
जेवीएम द्वारा 'जादू' के माध्यम से अन्य सामान की तरह काफी कुछ संभाला जाता है। वे JNI नहीं हैं और उनके पास उचित .c / .h फाइलें नहीं हैं, जो JVM के निहितार्थ को रोकती हैं। जब तक आप JVM लिख / हैक नहीं कर रहे हैं तब तक इस दृष्टिकोण का पालन नहीं किया जा सकता है।
यह ध्यान देने योग्य है कि सभी जावा विधियाँ native
"धीमी" नहीं हैं। उनमें से कुछ आंतरिक हैं जो उन्हें बहुत तेज बनाते हैं। यह जांचने के लिए कि कौन से आंतरिक हैं और कौन से नहीं हैं, आप vmSymbols.hppdo_intrinsic
पर देख सकते हैं ।
मूल रूप से JVM व्याख्यात्मक रूप से प्रत्येक JNI कॉल के लिए C मापदंडों का निर्माण करता है और कोड अनुकूलित नहीं है।
इस पत्र में उल्लिखित कई और विवरण हैं
यदि आप जेएनआई बनाम देशी कोड बेंचमार्किंग में रुचि रखते हैं तो इस परियोजना में बेंचमार्क चलाने के लिए कोड है।