मुझे वास्तव में कंपाइलर और जेआईटी ऑप्टिमाइज़ेशन के आंतरिक के बारे में बहुत कुछ पता नहीं है, लेकिन मैं आमतौर पर यह अनुमान लगाने के लिए "सामान्य ज्ञान" का उपयोग करने की कोशिश करता हूं कि अनुकूलित किया जा सकता है और क्या नहीं हो सकता है। तो वहां मैं आज एक साधारण इकाई परीक्षण विधि लिख रहा था:मैं कैसे लिखूं (परीक्षण) कोड जिसे संकलक/जेआईटी द्वारा अनुकूलित नहीं किया जाएगा?
@Test // [Test] in C#
public void testDefaultConstructor() {
new MyObject();
}
यह विधि वास्तव में मुझे चाहिए। यह जांचता है कि डिफ़ॉल्ट कन्स्ट्रक्टर मौजूद है और अपवादों के बिना चलता है।
लेकिन फिर मैंने कंपाइलर/जेआईटी अनुकूलन के प्रभाव के बारे में सोचना शुरू कर दिया। क्या संकलक/JIT new MyObject();
कथन को पूरी तरह से हटाकर इस विधि को अनुकूलित कर सकता है? बेशक, यह निर्धारित करने की आवश्यकता होगी कि कॉल ग्राफ़ के पास अन्य ऑब्जेक्ट्स के साइड इफेक्ट्स नहीं हैं, जो सामान्य कन्स्ट्रक्टर के लिए सामान्य मामला है जो ऑब्जेक्ट की आंतरिक स्थिति को प्रारंभ करता है।
मुझे लगता है कि केवल जेआईटी को इस तरह के अनुकूलन करने की अनुमति होगी। इसका शायद मतलब है कि ऐसा कुछ नहीं है जिसके बारे में मुझे चिंता करनी चाहिए, क्योंकि परीक्षण विधि केवल एक बार की जा रही है। क्या मेरी धारणाएं सही हैं?
फिर भी, मैं सामान्य विषय के बारे में सोचने की कोशिश कर रहा हूं। जब मैंने सोचा कि इस विधि को अनुकूलित करने से कैसे रोकें, मैंने सोचा कि मैं assertTrue(new MyObject().toString() != null)
कर सकता हूं, लेकिन यह toString()
विधि के वास्तविक कार्यान्वयन पर बहुत निर्भर है, और फिर भी, जेआईटी निर्धारित कर सकता है कि toString()
विधि हमेशा एक गैर-शून्य देता है स्ट्रिंग (उदाहरण के लिए यदि वास्तव में Object.toString()
कहा जा रहा है), और इस प्रकार पूरी शाखा को अनुकूलित करें। तो इस तरह से काम नहीं करेगा।
मुझे पता है कि सी # में मैं [MethodImpl(MethodImplOptions.NoOptimization)]
का उपयोग कर सकता हूं, लेकिन यह वही नहीं है जो मैं वास्तव में देख रहा हूं। मैं यह सुनिश्चित करने के लिए एक (भाषा-स्वतंत्र) तरीका ढूंढने की उम्मीद कर रहा हूं कि इस प्रक्रिया में जेआईटी हस्तक्षेप किए बिना मेरे कोड के कुछ विशिष्ट भाग वास्तव में चलेंगे।
इसके अतिरिक्त, क्या मेरे यूनिट परीक्षण बनाने के दौरान मुझे कोई विशिष्ट ऑप्टिमाइज़ेशन केस पता होना चाहिए?
बहुत बहुत धन्यवाद!
धन्यवाद। मुझे आश्चर्य है कि जेआईटी इस तरह से क्यों व्यवहार करता है? यदि कोई ऑब्जेक्ट आवंटन बेकार है (जैसा कि वास्तव में कुछ मामलों में स्थिर विश्लेषण द्वारा निर्धारित किया जा सकता है), तो जेआईटी इसे अनुकूलित क्यों नहीं करेगा? –
हालांकि अब मैं एक कोने के मामले के बारे में सोच सकता हूं, लेकिन मुझे लगता है कि यह काफी दुर्लभ है।यदि ऑब्जेक्ट आवंटन उदाहरण के लिए किया गया था ताकि यह सुनिश्चित किया जा सके कि कुछ अन्य ऑब्जेक्ट्स (और यहां तक कि सुनिश्चित करने के लिए कि कोई पेजिंग नहीं होगी) के लिए पर्याप्त मेमोरी उपलब्ध है, तो अनुकूलन धारणा को अमान्य कर देगा। –
जावा मेमोरी मॉडल के अनुसार JVM में प्रोग्राम कोड निष्पादित करने के साथ-साथ एक राज्य में जावा वर्चुअल मशीन (JVM) को छोड़ना आवश्यक है। वास्तव में किसी भी विशिष्ट कोड को निष्पादित करने की आवश्यकता नहीं है या घटना में स्मृति आवंटित करने की आवश्यकता नहीं है कि जेआईटी साबित कर सकता है कि कोड को देखने योग्य प्रोग्राम स्थिति पर कोई प्रभाव नहीं पड़ता है। –