2015-01-07 7 views
5

मैं array.count (सरणी में तत्वों की संख्या) को समझता हूं। गिनती सरणी के तत्व पर पुन: सक्रिय करने के लिए उपयोगी है। मैं इन सबसे छुटकारा array.capacityस्विफ्ट array.capacity बनाम array.count

capacity एक पूर्णांक मान का प्रतिनिधित्व करता है कि कुल कितने तत्वों सरणी पुनः आबंटन के बिना स्टोर कर सकते हैं का सार मिलता है (केवल पढ़ने के लिए)।

प्रयोग

मैं खेल का मैदान के साथ खेल किया गया है और पाया है एक सरणी की क्षमता सम संख्या (2 से वृद्धि) है

var arr = [1, 2, 3 , 4, 5, 6, 7] 
arr.removeLast() // capacity stays the same after a removal 
println(arr.capacity) // 8 
println(arr.count) // 6 

var arr = [1, 2, 3 , 4, 5, 6] 
arr.removeLast() 
println(arr.capacity) // 6 
println(arr.count) // 5 

सवाल

क्या सरणी क्षमता का उपयोग है? कृपया एक ठोस उदाहरण दें?

+0

यह AFAIK सिर्फ स्मृति स्थान preallocating का एक तरीका है। हालांकि आप इसे Google खोज के साथ ढूंढ पाएंगे। वास्तव में एक SO सवाल नहीं है। इसके अलावा, आपको क्यों जानने की ज़रूरत है? क्या गिनती पर्याप्त नहीं है? – Fogmeister

उत्तर

14

विशेष रूप से एक सरणी की क्षमता, इसकी reserveCapacity विधि-आपको सरणी में स्थान को पूर्वस्थापित करने देता है।

यदि आप किसी सरणी में तत्व जोड़ रहे हैं, और आप इसकी क्षमता को पार करते हैं, तो सरणी को इसकी क्षमता में वृद्धि करनी चाहिए। चूंकि एक स्विफ्ट सरणी अपने तत्वों को स्मृति में संयोजित रूप से संग्रहीत करती है, इसलिए इसे अपने आंतरिक भंडारण को पुन: आवंटित करना होगा और (आमतौर पर) अपने सभी तत्वों को पुराने संग्रहण से नए संग्रहण में कॉपी करना होगा। (ध्यान दें कि NSArray समीप उसके तत्वों स्टोर करने के लिए दस्तावेज नहीं है, लेकिन हम चाहते हैं कि स्विफ्ट सरणी अनुमान लगा सकते हैं शायद withUnsafeMutableBufferPointer विधि के अस्तित्व के आधार पर करता है।)

आप पहले में जानते हैं कि कैसे कई तत्वों आप करना चाहते हैं सरणी में जोड़ें, आप सरणी की क्षमता को पूर्व निर्धारित करने के लिए reserveCapacity विधि का उपयोग कर सकते हैं ताकि उसे किसी भी पुनर्वितरण (और संबंधित प्रतिलिपि) करने की आवश्यकता न हो।

एकमात्र कारणों से मैं अपनी क्षमता के लिए एक सरणी पूछने के बारे में सोच सकता हूं, यह सीखना है कि सिस्टम कैसे काम करता है, और प्रदर्शन समस्या को डीबग करने के लिए।

आमतौर पर आपको आरक्षित क्षमता के बारे में चिंता करने की आवश्यकता नहीं है। एक पुनर्वितरण शायद ही कभी एक प्रदर्शन समस्या है। स्विफ्ट का उपयोग करता है (मुझे विश्वास है) एक कुशल पुनर्वितरण अनुसूची ताकि पुनर्विक्रय की संख्या सरणी की अंतिम गणना में लॉगरिदमिक हो। जैसे यदि आप एक समय में दस लाख तत्व जोड़ते हैं, तो स्विफ्ट को 20-30 से अधिक पुनर्वितरण नहीं करना चाहिए।

लेकिन अगर आपको पता है कि आपकी सरणी बहुत बड़ी होगी (जैसे मैक पर गीगाबाइट्स या आईओएस डिवाइस पर मेगाबाइट्स के दसियों), या यदि आप एक प्रदर्शन-संवेदनशील कोड पथ में सरणी भर रहे हैं (उदाहरण के लिए ऑडियो भरना बफर जो माइक्रोसेकंड के भीतर खेलना शुरू कर देगा), आप क्षमता को आरक्षित करना और पुनर्वितरण से बच सकते हैं।

आप शायद क्षमता के आरक्षण के बारे में चिंता नहीं करनी चाहिए जब तक आप reallocations पता एक समस्या है, क्योंकि या तो प्रोफाइलर से पता चलता है कि वे एक टोंटी हो या क्योंकि आप (ऑडियो बफर उदाहरण में ऑडियो खामियों की तरह) अन्य सबूत है।

4

एक सरणी क्षमता

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

+0

"अब आपने देखा है, आप इसके बारे में भूल सकते हैं।" :) क्या आप एक उदाहरण दे सकते हैं कि बाहरी उपयोग के लिए यह कैसे उपयोगी हो सकता है? –

+0

@raychenon क्यों? NSArray के साथ ऐप्पल देव विशेष रूप से arrayWithCapacity का उपयोग करके निराश हो जाते हैं और बस सबकुछ स्वयं ही काम करते हैं। आपको ऐसा कुछ उदाहरण क्यों उपयोग करना चाहिए जिसका उपयोग शायद कभी नहीं करना चाहिए? – Fogmeister

+0

@Fogmeister क्योंकि किसी ने अभी तक यह नहीं दिखाया है कि क्षमता कैसे उपयोगी हो सकती है। बस एक सवाल से पहले मैं सो :) –

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