java - जेएनआई कॉल करने की मात्रात्मक ओवरहेड क्या है?




performance java-native-interface (2)

अकेले प्रदर्शन के आधार पर, जावा की लगभग "सरल" लाइनें, JNI कॉल करने के बराबर प्रदर्शन हिट है?

या प्रश्न को अधिक ठोस तरीके से व्यक्त करने की कोशिश करने के लिए, अगर एक साधारण जावा ऑपरेशन जैसे

someIntVar1 = someIntVar2 + someIntVar3;

1 का "सीपीयू काम" सूचकांक दिया गया था, जेएनआई कॉल करने के ओवरहेड के विशिष्ट (बॉलपार्क) "सीपीयू काम" सूचकांक क्या होगा?


यह प्रश्न मूल कोड के निष्पादन के लिए प्रतीक्षा किए गए समय की उपेक्षा करता है। टेलीफ़ोनिक पैरलेंस में, यह कॉल के "फ्लैग फ़ॉल" भाग के बारे में सख्ती से है, न कि "कॉल रेट" के बारे में।


इस प्रश्न को पूछने का कारण यह है कि जेएनआई कॉल को कोड करने की कोशिश करने पर परेशान करने के लिए "अंगूठे का नियम" जानना चाहिए जब आप मूल लागत (प्रत्यक्ष परीक्षण से) और किसी दिए गए ऑपरेशन की जावा लागत को जानते हैं। यह आपको जेएनआई कॉल को कोड करने की परेशानी से जल्दी से बचने में मदद कर सकता है ताकि कॉलआउट ओवरहेड ने देशी कोड का उपयोग करने के किसी भी लाभ का उपभोग किया।

संपादित करें:

कुछ लोगों को सीपीयू, रैम आदि में भिन्नता पर लटका दिया जा रहा है। ये सभी सवाल लगभग अप्रासंगिक हैं - मैं जावा कोड की लाइनों के सापेक्ष लागत के लिए पूछ रहा हूं। यदि सीपीयू और रैम खराब हैं, तो वे जावा और जेएनआई दोनों के लिए खराब हैं, इसलिए पर्यावरण संबंधी विचारों को संतुलित करना चाहिए। जेवीएम संस्करण "अप्रासंगिक" श्रेणी में आता है।

यह सवाल नैनोसेकेंड्स में एक पूर्ण समय के लिए नहीं पूछ रहा है, बल्कि "सरल जावा कोड की लाइनों" की इकाइयों में एक बॉल पार्क "कार्य प्रयास" है।


आपको वास्तव में इसे स्वयं परीक्षण करना चाहिए कि "विलंबता" क्या है। लेटेंसी को इंजीनियरिंग में परिभाषित किया जाता है क्योंकि शून्य लंबाई का संदेश भेजने में समय लगता है। इस संदर्भ में, यह सबसे छोटे जावा प्रोग्राम को लिखने के लिए है जो एक do_nothing खाली C ++ फ़ंक्शन को लिखता है और 30 से अधिक मापों में बीते हुए समय के साधनों और stddev की गणना करता है (अतिरिक्त गर्म कॉल करें) आप अलग-अलग औसत परिणामों के बारे में आश्चर्यचकित हो सकते हैं जो अलग-अलग JDK संस्करणों और प्लेटफार्मों के लिए समान हैं।

केवल ऐसा करने से आपको अंतिम उत्तर मिलेगा कि क्या JNI का उपयोग करने से आपके लक्षित वातावरण का कोई मतलब नहीं है।


इसलिए मैंने सिर्फ प्रोफाइल स्टार्टअप ऐड-ऑन के साथ एक्लिप्स मार्स आईडीई, जेडीके 1.8.0_74 और वर्चुअलवीएम प्रोफाइलर का उपयोग करके विंडोज 8.1, 64-बिट पर जेएनआई कॉल के लिए "विलंबता" का परीक्षण किया।

सेटअप: (दो विधियाँ)
SOMETHING () तर्कों को पारित करता है, सामान करता है, और तर्क देता है
कुछ भी नहीं () एक ही तर्क में गुजरता है, उनके साथ कुछ भी नहीं करता है, और एक ही तर्क देता है।

(प्रत्येक को 270 बार कहा जाता है)
सोम्मेटिंग (): 6523ms के लिए कुल रन समय
NOTHING (): 0.102ms के लिए कुल रन समय

इस प्रकार मेरे मामले में जेएनआई कॉल काफी नगण्य हैं।





java-native-interface