2012-09-05 10 views
18

कुछ बार आप कचरा कलेक्टर से बचने/कम करने के लिए चाहते हैं, इसलिए मैं यह सुनिश्चित करना चाहता हूं कि इसे कैसे किया जाए।गो में कचरा संग्रह को कम करने के लिए कैसे?

मुझे लगता है कि अगले एक सही है:

  • समारोह की शुरुआत में चर घोषित करें।
  • स्लाइस के बजाय सरणी का उपयोग करने के लिए।

और भी?

+0

मुझे लगता है कि आपको इस तरह के किसी भी अनुकूलन करने से पहले प्रोफाइल करना चाहिए। [यह] देखें (http://blog.golang.org/2011/06/profiling-go-programs.html) प्रोफाइलिंग के बारे में ब्लॉग प्रविष्टि। वे कचरा संग्रह को भी अनुकूलित करते हैं। एक अच्छी शुरुआत होनी चाहिए? – Christian

+4

यह क्यों बंद है? प्रश्न: कचरा संग्रह से कैसे बचें? ढेर आवंटन से बचें (विशिष्ट संदर्भित उदाहरणों के साथ)। प्रश्न प्रासंगिक और विशिष्ट है और उत्तर बहस योग्य प्रतीत नहीं होता है। – user634175

उत्तर

21

कचरा से बचने अपेक्षाकृत सीधे आगे है। आपको यह समझने की जरूरत है कि आवंटन कहां किए जा रहे हैं और देखें कि क्या आप आवंटन से बच सकते हैं।

सबसे पहले, किसी फ़ंक्शन की शुरुआत में घोषित चर सक्षम नहीं होंगे। कंपाइलर अंतर नहीं जानता है। हालांकि, इंसानों को अंतर पता होगा और इससे उन्हें परेशान होगा।

स्लाइस के बजाय एक सरणी का उपयोग काम करेगा, लेकिन ऐसा इसलिए है क्योंकि सरणी (जब तक कि संदर्भित नहीं किया जाता) को ढेर पर रखा जाता है। Arrays के पास अन्य मुद्दों जैसे तथ्य यह है कि वे कार्यों के बीच मूल्य (प्रतिलिपि) द्वारा पारित कर रहे हैं। ढेर पर कुछ भी "कचरा नहीं है" क्योंकि समारोह वापस आने पर इसे मुक्त किया जाएगा। फ़ंक्शन से बचने वाले किसी भी पॉइंटर या स्लाइस को ढेर पर रखा जाता है जिसे कचरा कलेक्टर को किसी बिंदु पर सौदा करना चाहिए।

सबसे अच्छी बात यह है कि आप आवंटन से बच सकते हैं। जब आप डेटा के बड़े बिट्स के साथ काम करते हैं, जिनकी आपको आवश्यकता नहीं होती है, तो उनका पुन: उपयोग करें। यह गो ब्लॉग पर profiling tutorial में उपयोग की जाने वाली विधि है। मैं इसे पढ़ने का सुझाव देता हूं।

प्रोफाइलिंग ट्यूटोरियल में से एक के अलावा एक और उदाहरण: मान लें कि आपके पास []int नाम का एक टुकड़ा xs है। जब तक आप किसी शर्त तक नहीं पहुंच जाते हैं तब तक आप लगातार []int में संलग्न होते हैं और फिर आप इसे रीसेट करते हैं ताकि आप शुरू कर सकें। यदि आप xs = nil करते हैं, तो अब आप कटाई के अंतर्निहित सरणी को कचरा इकट्ठा करने के रूप में घोषित कर रहे हैं। अगली बार जब आप इसका इस्तेमाल करेंगे तो संलग्न करें xs को फिर से आवंटित करेंगे। यदि आप xs = xs[:0] करते हैं, तो भी आप इसे रीसेट कर रहे हैं लेकिन पुराने सरणी को रखते हुए।

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

29

गो में कचरा संग्रह को कम करने के लिए, आपको ढेर आवंटन को कम करना होगा। ढेर आवंटन को कम करने के लिए, आवंटन होने पर आपको समझना होगा।

निम्नलिखित बातें हमेशा कारण आवंटन (कम से कम जाओ 1 के रूप में जीसी संकलक में):

  • new में निर्मित समारोह
  • make में निर्मित समारोह का उपयोग का उपयोग करना (सिवाय कुछ संभावित कोने मामलों में)
  • समग्र प्रकार जब मूल्य प्रकार एक टुकड़ा, नक्शा, या & ऑपरेटर
  • से अधिक मूल्य डालकर समग्र अक्षर एक इंटरफेस में एक मशीन शब्द। (उदाहरण के लिए, तार, स्लाइस, और कुछ structs मशीन शब्द से बड़े होते हैं।)
  • , []rune
  • string के बीच []byte, और
      परिवर्तित जाओ 1.3 के रूप में, संकलक विशेष मामलों इस अभिव्यक्ति आवंटित नहीं करने के लिए: m[string(b)], जहां m नक्शा दिया गया है और b एक []byte
  • परिवर्तित है string
  • defer कथन
  • पर एक गैर-निरंतर पूर्णांक मानबयान
  • समारोह शाब्दिक कि कब्जा स्थानीय चर

निम्नलिखित बातें कर सकते हैं कारण आवंटन, विवरण के आधार पर:

  • एक चर के पते ले रहा है। ध्यान दें कि पते को पूरी तरह से लिया जा सकता है। उदाहरण के लिए a.b()a का पता ले सकता है यदि a कोई पॉइंटर नहीं है और b विधि में पॉइंटर रिसीवर प्रकार है।
  • का उपयोग append में निर्मित समारोह
  • एक variadic समारोह या विधि
  • एक सरणी
  • मानचित्र

को एक तत्व जोड़ने की क्रिया कॉलिंग सूची पूरी करने वाला है और मैं मैं इसमें काफी आत्मविश्वास रखता हूं, लेकिन जोड़ों या सुधारों पर विचार करने में प्रसन्न हूं।

यदि आप अनिश्चित हैं कि आपके आवंटन कहां हो रहे हैं, तो आप हमेशा दूसरों के सुझाव के रूप में प्रोफ़ाइल कर सकते हैं या संकलक द्वारा उत्पादित असेंबली को देख सकते हैं।

+1

आप कंपाइलर के बचने के विश्लेषण को देखने के लिए 'go build -gcflags = "- m" 'का उपयोग कर सकते हैं। जब संभव हो तो स्टैक पर 'x: = make ([] बाइट, 42) जैसी चीज़ें डालने पर यह बहुत बेहतर हो गया है। –

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