2009-03-18 7 views
10

यदि आप एक लूप में 10,000 तार बनाते हैं, तो बहुत सारे कचरे का संग्रह होता है जो बहुत सारे संसाधनों का उपयोग करता है।रूबी प्रतीक एकत्र कचरा नहीं हैं !? फिर, स्ट्रिंग का उपयोग करना बेहतर नहीं है?

यदि आप प्रतीकों के साथ एक ही काम करते हैं, तो आप ऑब्जेक्ट्स बनाते हैं जो cannot be garbage collected

कौन सा बुरा है?

उत्तर

7

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

इसी तरह, तारों को रूबी में अद्वितीय होना आवश्यक है। यह उनके द्वारा उपयोग किए जाने के तरीके के कारण है - पाठ प्रसंस्करण इत्यादि

तय करें कि कौन से किसी को अपने अर्थशास्त्र के आधार पर उपयोग करना है, समय-समय पर अनुकूलित न करें।

8

आप अपने पाश में एक ही प्रतीक का उल्लेख है, तो इसे पुन: करने के लिए यानी

while i < 10000 
    i += 1 
    :im_using_this_symbol_here 
end 

उस वस्तु हर अब अगर आप के बजाय वहां एक स्ट्रिंग का उपयोग नहीं है, स्ट्रिंग 10K बार निर्मित हो जाएगा । आम तौर पर, उन मामलों में प्रतीकों का उपयोग करें जहां आप लगभग शाब्दिक या स्थिर की तरह व्यवहार करते हैं। मेरे लिए एक बहुत अच्छा उदाहरण होगा

link_to "News", :action => 'news' 

बजाय

link_to "News", "action" => 'news' 

कार्रवाई की जा रही बार-बार फिर से इस्तेमाल किया खरीद सकते हैं।

+11

मैं एक सामान्य नियम के जोड़ सकते हैं: कभी नहीं, कभी, प्रतीकों के लिए किसी भी उपयोगकर्ता के आपूर्ति तार परिवर्तित। इससे एक डॉस हमले की संभावना खुल जाएगी। – Arsen7

6

यदि आप रूबी 2.2.0 या बाद में उपयोग कर रहे हैं, तो आमतौर पर बहुत सारे प्रतीकों को गतिशील बनाने के लिए यह ठीक होना चाहिए, क्योंकि Ruby 2.2.0-preview1 announcement के अनुसार उन्हें कचरा इकट्ठा किया जाएगा, जिसमें more details about the new symbol GC का लिंक है। हालांकि, यदि आप अपने गतिशील प्रतीकों को किसी प्रकार के कोड में पास करते हैं जो इसे एक आईडी (सी स्रोत कोड में उपयोग की जाने वाली आंतरिक रूबी कार्यान्वयन अवधारणा) में परिवर्तित करता है, तो उस स्थिति में इसे पिन किया जाएगा और कभी कचरा एकत्र नहीं किया जाएगा। मुझे यकीन नहीं है कि आमतौर पर ऐसा होता है।

जब तय प्रतीकों या तार का उपयोग करने पर विचार कर सकते:

  • चिह्न बदला नहीं जा सकता के बाद वे बनाया जाता है।
  • प्रतीकों में स्ट्रिंग्स की बहुत सारी विधियां नहीं हैं, जैसे
  • प्रतीकों को समानता के लिए एक दूसरे से तुलनात्मक रूप से तुलना की जा सकती है।
  • प्रतीकों को Symbol docs के अनुसार कुछ के नाम का प्रतिनिधित्व करना माना जाता है। मैं उनको कुछ भी स्टोर करने के लिए उपयोग नहीं करता जिसे नाम नहीं माना जा सकता था।
संबंधित मुद्दे