लगता है कि जावा या पायथन की तुलना में C या C ++ में विभिन्न गति गुणों की बहुत अधिक चर्चा हो रही है, लेकिन मैं शायद ही कभी Object-C का उल्लेख करता हूं। मोटे तौर पर यह भाषा के प्रदर्शन के मामले में कहां गिरता है?
लगता है कि जावा या पायथन की तुलना में C या C ++ में विभिन्न गति गुणों की बहुत अधिक चर्चा हो रही है, लेकिन मैं शायद ही कभी Object-C का उल्लेख करता हूं। मोटे तौर पर यह भाषा के प्रदर्शन के मामले में कहां गिरता है?
जवाबों:
C ++ के विपरीत, Objective-C को C के एक स्वच्छ सुपरसेट के रूप में डिज़ाइन किया गया है। मेरे द्वारा उपयोग किए जाने वाले कुछ Objective-C कंपाइलर C कंपाइलर के रूप में जाने जाते हैं, लेकिन Objective-C को भी संभालते हैं।
इसलिए, यह मान लेना सुरक्षित है कि कोड जनरेशन लेवल में C और ऑब्जेक्टिव-सी बराबर हैं।
पहला अंतर OOP ABI में दिखाई देता है, जिसे "लेट मेथड बाइंडिंग" भी कहा जाता है। C ++ की तरह, Objective-C कंपाइलर-जनरेटेड फंक्शन पॉइंटर टेबल में निर्भर करता है जो रनटाइम पर ट्रैवर्स किए जाते हैं।
सी ++ के विपरीत, हालांकि, बाध्यकारी विधि अधिक 'गतिशील' है, और id
हर जगह सुपरक्लास के उपयोग को बढ़ावा देता है, यह सिद्धांत में सी ++ की तुलना में थोड़ा धीमा बनाता है। व्यवहार में, यह अंतर औसत दर्जे से कम है।
अंत में, सबसे महत्वपूर्ण प्रदर्शन मुद्दा पुस्तकालयों की गुणवत्ता का उपयोग किया जाता है। चूंकि ऑब्जेक्टिव-सी केवल एप्पल सिस्टम में वास्तव में लोकप्रिय है, इसलिए यह मानना उचित है कि आप इसे कोको के साथ उपयोग कर रहे हैं; जो उच्च-स्तरीय पुस्तकालयों का एक अच्छा समूह है। ज्यादातर मामलों में, आप उनके लिए भारी उठाने को छोड़ सकते हैं, इसलिए आपका कोड या तो इतना तेज़ नहीं होना चाहिए, या यदि आप भारी क्रंचिंग करते हैं, तो यह ज्यादातर-स्थिर कोड आधार होने की संभावना है, लगभग सादे सी के समान है। ।
TL; DR: यह C और C ++ भाषाओं के साथ वहीं है जहां यह सबसे ज्यादा मायने रखता है। यदि आपको अच्छा प्रदर्शन नहीं मिल रहा है, तो अपने एल्गोरिदम की जांच करें; बस किसी भी गंभीर भाषा में।
ऑब्जेक्टिव- C, C / C ++ से धीमा है। ऑब्जेक्टिव-सी का रनटाइम होने का कारण यह है कि विधियों को गतिशील रूप से स्मालटाक के रूप में उसी तरह से देखता है, जिससे उसने इस निष्पादन मॉडल को लिया है। रनटाइम के सभी तरीकों को डिस्पैच किया जाता है, "सही संदेश भेजता है" को C / C ++ में फ़ंक्शन कॉल के विपरीत कहा जाता है, जहां फ़ंक्शन एड्रेस को संकलन समय पर निर्धारित किया जाता है (C ++ वर्चुअल विधियों को छोड़कर)। लेकिन मैं यह नहीं कह सकता कि उद्देश्य कितना धीमा है। ASAIK का उपयोग केवल प्रदर्शन के दंड के कारण अनुप्रयोग विकास के लिए किया जाता है।
संक्षिप्त उत्तर: इसे C / C ++ / D / Go / Rust के समान प्रारूप में संकलित किया गया है। यह जावा / .Net जैसे आभासी वातावरण का उपयोग नहीं करता है। और इसकी व्याख्या पाइथन / रूबी / लुआ / जावास्क्रिप्ट जैसी नहीं है। तो यह स्पेक्ट्रम के तेज अंत पर है।
ओब्ल्वर-सी और सी / सी ++ के बीच मौलिक गति अंतर, जैसा कि ओलिवर नीचे कहता है, गतिशील विधि प्रेषण के कारण हैं।
यह लेख इस ओवरहेड को Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946 में प्रोफाइल करता है
जब आप विधि प्रेषण (यानी objc_msgSend) को सीमित कारक निर्धारित करते हैं, तो यह आपके ओबज-सी कोड को अनुकूलित करने के लिए एक बहुत अच्छी चाल प्रदान करता है - एक बार फ़ंक्शन को पॉइंटर प्राप्त करने के लिए, और फ़ंक्शन को कॉल करने के लिए कई बार इसका उपयोग करें। यह बहुत मदद नहीं करना चाहिए क्योंकि ओबज-सी रनटाइम्स इस अनुकूलन को स्वचालित रूप से करते हैं ।
ध्यान दें कि डायनेमिक विधि प्रेषण की सही लागत कैश मिस के कारण है, क्योंकि यह सीपीयू शाखा की भविष्यवाणी को तोड़ती है। ये प्रोफाइल के लिए कठिन हैं और यह हो सकता है कि ऊपर उद्धृत कोड सही कैश मिस कॉस्ट को मापे नहीं।
कुछ और उपयोगी चर्चा यहाँ है: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605
नीचे पंक्ति: भाषाओं के बीच सबसे बड़ा अंतर आपके एल्गोरिदम हैं। इसके अलावा, गतिशील या आभासी विधि प्रेषण के कारण ओब्ज-सी, सी और सी ++ के बीच एक मूलभूत गति अंतर है। यह दूसरा बिंदु बड़ा प्रतीत नहीं होता है। और ऊपर दिया गया लेख इसे ऑप्टिमाइज़ करने के लिए एक ट्रिक देता है, यदि आप प्रोफाइलिंग के माध्यम से हॉट स्पॉट पा सकते हैं, जो सीपीयू कैश मिस के कारण मुश्किल हो सकता है।