2010-09-14 4 views
11

मुझे एहसास है कि समयपूर्व अनुकूलन के रूप में क्या मायने रखता है एक व्यक्तिपरक घटक है, लेकिन यह एक अनुभवजन्य या सर्वोत्तम अभ्यास प्रश्न है।उद्देश्य-सी (आईओएस के लिए) में स्ट्रक्चर का उपयोग करना: समयपूर्व अनुकूलन?

जब iOS के लिए प्रोग्रामिंग, मैं struct और typedefs जहां किसी चीज़ का कोई "" व्यवहार है का उपयोग कर पसंद किए जाने वाले (तरीकों, मूल रूप से)? मेरी भावना यह है कि struct वाक्यविन्यास गैर-सी व्यक्ति के लिए थोड़ा अजीब है, लेकिन यह कम प्रोफ़ाइल होना चाहिए। फिर फिर, 50K NSObject उदाहरणों के साथ कुछ मामलों का परीक्षण, यह बुरा प्रतीत नहीं होता है (रिश्तेदार, मुझे पता है)। क्या मुझे "इसका उपयोग करना चाहिए" (जहां संभव हो वहां structs का उपयोग करें) या NSObject उदाहरण ठीक है, जब तक कि मेरे पास प्रदर्शन समस्याएं न हों?

विशिष्ट मामले दो int सदस्य चर के साथ एक वर्ग होगा। मैंने पढ़ा है कि दो NSString उदाहरणों (या किसी भी NSObject सबक्लास) को पकड़ने के लिए एक स्ट्रक्चर का उपयोग करना एक बुरा विचार है।

+1

मैं यह कहने के लिए जगह पढ़ना चाहूंगा कि NSObject क्लास को पकड़ने के लिए संरचना का उपयोग करना एक बुरा विचार है, केवल – vodkhang

+0

सीखने के लिए यह एक बुरा विचार है क्योंकि, उम, आप 'बनाए रखने' और 'रिलीज' को बनाए रखने के लिए कहां जा रहे हैं? – Yuji

+0

@vodkhang, कहीं http://stackoverflow.com/questions/1064500/pass-and-access-structures-using-objective-c यहाँ –

उत्तर

10

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

+0

धन्यवाद में, कि मेरा निर्णय 3 बजे कल रात था। सिर्फ यह देखना चाहता था कि मैं पागल हो गया हूं या नहीं। –

+1

यह एक महत्वपूर्ण निर्णय है और थोड़ी देर के बारे में सोचना अच्छा विचार है। लेकिन आज के हार्डवेयर का प्रदर्शन - यहां तक ​​कि मोबाइल, निचले स्तर की सामग्री - आश्चर्यजनक है और इस मुद्दे को लगभग कोई ब्रेनर नहीं बनाता है। – zoul

+1

हां। यह वास्तव में एक अजीब दुनिया है जिसमें कुछ लोग एक स्तर के अमूर्त यूपी (मोनो टच) या अन्य दुनिया में, स्वीकार्य प्रदर्शन दंड के साथ कई स्तरों के अवशोषण (जेवीवी में ग्रोवी) काम कर रहे हैं, और अन्य लोग सबकुछ अनुकूलित करने पर जोर दे रहे हैं जितना संभव हो। आपके लिए धन्यवाद "कसकर गेम लूप" पर ध्यान दें, यह निश्चित रूप से मुझे समझने में मदद करता है कि क्या संभव है। –

11

एक उद्देश्य सी वस्तु, एक struct के रूप में लगभग एक ही भंडारण है। यही वह है - केवल एक पॉइंटर जहां एक स्थान पर रनटाइम सभी कक्षा की जानकारी रखती है।

यदि आप स्मृति पर तंग हैं, तो 4 बाइट्स खो दें, लेकिन आम तौर पर केवल बड़ी संख्या में ऑब्जेक्ट्स के लिए होता है: 50,000 एनब्बजेक्ट बनाम structs केवल 200k है - आपको 200k के लिए बहुत सारी चीजें मिलती हैं। एक लाख वस्तुओं के लिए, लागत एक आईफोन पर जोड़ दिया जाएगा।

यदि आप वस्तुओं को ओपनजीएल में स्थानांतरित करना चाहते हैं या अन्य उद्देश्यों के लिए सी सरणी की आवश्यकता है, तो दूसरा विकल्प एक एनएसओब्जेक्ट बनाना है जिसमें सभी 50,000 पूर्णांकों के लिए एक मॉलोकॉइड पॉइंटर है। फिर उद्देश्य सी मेमोरी ओवरहेड ~ 0 है, और आप सभी गंदे मॉलोक और फ्री() सामान को एक .m फ़ाइल के अंदरूनी हिस्सों में समाहित कर सकते हैं।

+0

हमम, मुझे लगता है कि यह सिर्फ स्मृति के साथ समस्या नहीं है। यह संदर्भ के बारे में भी है। मुझे याद है कि यदि आप संरचना का उपयोग करते हैं, तो आपको ढेर ऑब्जेक्ट मेमोरी तक पहुंच नहीं है, केवल स्टैक एक्सेस है, जो बहुत तेज़ है :) (मेरा ज्ञान सी # से है, ओबीजे-सी के बारे में निश्चित नहीं है) – vodkhang

+1

+1 कम आवश्यकता वाले सामान को लपेटने के लिए जब आपको वास्तव में इसकी आवश्यकता होती है। – zoul

+1

@ वोदखांग: गति कोई फर्क नहीं पड़ता, जब तक कि आप कण इंजन की तरह कुछ कोड नहीं करना चाहते हैं, जिसमें हजारों व्यक्तिगत वस्तुओं को 30 एफपीएस पर पुन: गणना की जाती है। – zoul

3

मेरे लिए, मैं क्योंकि आप आसानी से काम वस्तु कर सकते हैं के साथ, को बनाए रखने जारी, autorelease तरह नियमित रूप से वस्तुओं का उपयोग करना पसंद करेंगे। मुझे केवल कोको फ्रेमवर्क जैसे CGSize, CGRect और CGPoint में कुछ कुछ structs दिखाई देते हैं। मुझे लगता है कि कारण यह है कि वे एक बहुत इस्तेमाल किया जा रहा

+0

कोको –

1

मेरा मानना ​​है कि एक अच्छा विचार structs विशेष रूप से यदि आप सी-आधारित चौखटे के साथ काम कर रहे हैं का उपयोग करने के लिए है, की सुविधा देता है ओपन कहते हैं, CoreGraphics, विशेष रूप से सामान है कि एक जोड़े की आवश्यकता होगी CoreText/स्याही, युगल, वर्ण, इत्यादि का ट्रिपल (यदि वे पहले से ही कुछ ऐप्पल फ्रेमवर्क में लागू नहीं किए गए हैं: सीजीईजीईटी, सीजीपॉइंट, सीटीआरईटीटी, एनएसआरेंज, आदि ...) सी सामान बजाता है और अन्य सी सामानों के साथ बेहतर दिखता है।

मुझे नहीं लगता कि मैं ints की एक जोड़ी युक्त NSObject का एक उपवर्ग लिखना होगा। यह लगभग हास्यास्पद है। जबरदस्त हंसी।

14

Struct उन में NSObject उदाहरणों के साथ निश्चित रूप से एक बुरा विचार कर रहे हैं। रीटेन गिनती को सही तरीके से संभालने के लिए आपको -init और -dealloc की आवश्यकता है। कॉलर पक्ष से retain और releases लिखना सिर्फ पागल है। यह कभी भुगतान नहीं करेगा।

Struct दो int या चार double रों साथ सीमा रेखा मामले हैं। कोको फ्रेमवर्क स्वयं एक संरचना के रूप में NSRect, NSPoint आदि लागू करता है। लेकिन उस तथ्य ने बहुत सारे और नए आने वालों को भ्रमित कर दिया है। ईमानदारी से, आदिम प्रकारों और वस्तु प्रकारों के बीच भेद भी उन्हें भ्रमित कर दिया।आप एक वस्तु के गुणों के रूप में struct रों है जब यह भी मेरे लिए भ्रमित हो जाता है: आप

object.frame.origin.x=10; 

आप अपने खुद के struct रों कमाना शुरू, तो आप याद करने के लिए जो जो है की जरूरत नहीं कर सकते। यह फिर से एक परेशानी है। मुझे लगता है कि वे क्यों (NSRect इत्यादि) struct मूल रूप से ऐतिहासिक हैं।

मैं सब कुछ वस्तुओं बनाने के लिए पसंद करेंगे। और उपलब्ध होने पर कचरा संग्रह का उपयोग करें।

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

5

मैं structs का उपयोग कर आदिम (जैसे गैर वस्तु) प्रकार की छोटी मात्रा धारण करने के लिए जहां कोई व्यवहार की आवश्यकता होती है के साथ सभी में कोई समस्या देखते हैं। उदाहरण के लिए कोको फ्रेमवर्क (CGRect, CGSize, CGPoint, NSRange) में पहले से ही इसके कई उदाहरण हैं।

structs का उपयोग ऑब्जेक्टिव-सी वस्तुओं धारण करने के लिए न करें। यह संदर्भ गिनती पर्यावरण में स्मृति प्रबंधन को जटिल बनाता है और जीसी पर्यावरण में इसे पूरी तरह से तोड़ सकता है।

+0

के बारे में अच्छी बात मैंने सोचा कि मैंने पूरी तरह से सवाल का जवाब दिया है। आपने कहा "क्या मुझे इसका इस्तेमाल करना चाहिए?" जवाब हां है, क्योंकि, छोटी संरचनाओं के लिए यह पहले से ही काफी आम है। – JeremyP

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