2010-06-25 13 views
10

मैंने रिशेर्पर का उपयोग शुरू किया और यह संकेत दिया कि एक विधि स्थिर हो सकती है। स्थिर तरीकों से कुछ सौ विधियों को परिवर्तित करने से बड़ी अवधि में मेमोरी पदचिह्न बढ़ जाएगा?विधियों को स्थिर तरीकों से परिवर्तित करते समय मेमोरी उपयोग

उत्तर

15

नहीं - स्थिर तरीकों में बदलना स्मृति पर कोई प्रभाव नहीं पड़ता है।

पहली बार एक प्रकार का संदर्भ दिया गया है (चाहे स्थैतिक या गैर स्थैतिक), किसी भी स्थिर सदस्य प्रारंभ किए जाते हैं और स्थैतिक रचनाकार चलाए जाते हैं।

हालांकि, यदि आप गैर स्थैतिक से स्थिर तक स्विचिंग विधियों पर विचार कर रहे हैं, तो इसका कचरा संग्रह या कुल मेमोरी पदचिह्न पर कोई प्रभाव नहीं पड़ेगा।

यदि आप कक्षा के सदस्यों को स्थैतिक सदस्यों के रूप में बदलते हैं तो आपको स्मृति पदचिह्न बदलने के बारे में चिंता करने की ज़रूरत है। इस मामले में, टाइप किए जाने के बाद स्थिर फ़ील्ड रूट रहेंगे, और जीसी द्वारा एकत्र नहीं किया जाएगा। यह आम तौर पर केवल तभी किया जाता है जब आवश्यक हो, और डिज़ाइन द्वारा - आप एक सदस्य स्थिर बनाते हैं क्योंकि आप इसे जारी रखना चाहते हैं।

+0

क्या स्मृति में कहीं भी संग्रहीत स्थिर विधि की एक प्रति है? मेरी धारणा यह थी कि जब आपने एक स्थिर विधि का संदर्भ दिया, तो उसे कहीं भी संग्रहीत किया जाएगा, और फिर प्रत्येक अनुवर्ती संदर्भ विधि के उस उदाहरण का उपयोग करेगा, लेकिन मुझे लगता है कि यह धारणा गलत हो सकती है। –

+3

"विधि", चाहे स्थैतिक या उदाहरण विधियां, स्मृति में एक बार लोड हो जाती हैं जब उन्हें प्रक्रिया स्थान में लाया जाता है, और जेआईटी द्वारा संकलित किया जाता है। स्थैतिक और गैर स्थैतिक के बीच विधि उपयोग में वास्तव में कोई अंतर नहीं है। इस बात पर फ़ोकस करें कि आपके विशिष्ट मामले में स्थिर विधियां उचित हैं या नहीं और यह निर्धारित करने के लिए कि कोई विधि स्थिर या आवृत्ति विधि हो या नहीं। –

+0

मेमोरी पर बहुत ही छोटा प्रभाव पड़ता है - क्योंकि "कोड" को उन तरीकों से पास करने के लिए अतिरिक्त कोड उत्पन्न होता है जो इसका उपयोग नहीं करते हैं। – Qwertie

7

जेआईटी कंपाइलर के दृष्टिकोण से, स्थिर और एक आवृत्ति विधि के बीच कोई अंतर नहीं है। उनके लिए मशीन कोड बहुत समान है, यह एक ही तरह के ढेर में संग्रहीत हो जाता है। केवल अंतर यह है कि एक उदाहरण विधि में एक अतिरिक्त तर्क है।

विधि को कॉल करते समय उस अतिरिक्त तर्क को पारित करने की आवश्यकता है। इससे अतिरिक्त मशीन कोड निर्देश हो सकता है लेकिन अक्सर नहीं। सीपीयू रजिस्टर (ईसीएक्स) में पहले से ही सही मूल्य है। यदि कोई उदाहरण विधि x86 पर एक से अधिक तर्क है या x64 पर तीन से अधिक तर्क है, तो एक सीपीयू रजिस्टर के बजाय स्टैक पर एक अतिरिक्त तर्क पारित किया जाना चाहिए। एक अतिरिक्त निर्देश।

सबसे खराब मामला, आप एक नैनोसेकंड से थोड़ा कम देख रहे हैं। माइक्रो-ऑप्टिमाइज़ेशन के साथ सामान्य समस्या को मापने में मुश्किल होगी।

+0

यह मूल प्रश्न के दायरे से बाहर हो सकता है, लेकिन एक विधि, स्थैतिक या नहीं, जब ढेर पर संग्रहीत किया जाता है? क्या यह सिर्फ विधि ही है, या विधि वाला वर्ग का उदाहरण, या कुछ और पूरी तरह से? क्या यह स्मृति कभी कचरा संग्रह द्वारा एकत्र की जाती है? –

+0

विधि कॉल के दौरान ढेर पर कुछ भी संग्रहीत नहीं होता है। सीपीयू रजिस्टरों और ढेर के माध्यम से तर्क पारित किए जाते हैं। कुछ भी एकत्र करने की जरूरत नहीं है। पेटज़ोल्ड की पुस्तक "कोड" आपको रूचि दे सकती है। –

+0

ठीक है कि बहुत समझ में आता है। तो वास्तव में, मेरे तरीकों को गैर स्थैतिक से स्थैतिक में परिवर्तित करने का एकमात्र कारण क्लास इंस्टेंटेशन के बिना उन्हें एक्सेस करना होगा? आपकी सिफारिश के लिए धन्यवाद। –

संबंधित मुद्दे