भाषा प्रदर्शन सातत्य में ऑब्जेक्टिव-सी कहां गिरता है?


20

लगता है कि जावा या पायथन की तुलना में C या C ++ में विभिन्न गति गुणों की बहुत अधिक चर्चा हो रही है, लेकिन मैं शायद ही कभी Object-C का उल्लेख करता हूं। मोटे तौर पर यह भाषा के प्रदर्शन के मामले में कहां गिरता है?


23
1986 - ब्रैड कॉक्स और टॉम लव ने ऑब्जेक्टिव-सी बनाया, यह घोषणा करते हुए कि "इस भाषा में सी की सभी मेमोरी सुरक्षा है जो स्मॉलटाक की सभी धधकती गति के साथ संयुक्त है।" आधुनिक इतिहासकारों को संदेह है कि दोनों डिस्लेक्सिक थे। ( स्रोत )
मेसन व्हीलर

4
यह उस सीमा में आता है जहाँ प्रदर्शन अधिक मायने नहीं रखता है। यह कोको के लिए हस्तक्षेप करने के लिए एकमात्र समर्थित भाषा है, इसलिए यदि आप ऐसा करना चाहते हैं, तो कुछ और काम नहीं करता है। किसी और चीज के लिए, मैं प्रदर्शन के बावजूद इसे एक भयानक विकल्प मानूंगा।
जेरी कॉफिन

1
"प्रदर्शन" एक भाषा की विशेषता नहीं है, लेकिन एक भाषा कार्यान्वयन और, अधिक महत्वपूर्ण बात, उस भाषा में लिखे गए कार्यक्रमों की। आप Objective-C में बहुत तेज प्रोग्राम लिख सकते हैं, या आप बहुत धीमी गति से लिख सकते हैं।
कालेब

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

जवाबों:


28

C ++ के विपरीत, Objective-C को C के एक स्वच्छ सुपरसेट के रूप में डिज़ाइन किया गया है। मेरे द्वारा उपयोग किए जाने वाले कुछ Objective-C कंपाइलर C कंपाइलर के रूप में जाने जाते हैं, लेकिन Objective-C को भी संभालते हैं।

इसलिए, यह मान लेना सुरक्षित है कि कोड जनरेशन लेवल में C और ऑब्जेक्टिव-सी बराबर हैं।

पहला अंतर OOP ABI में दिखाई देता है, जिसे "लेट मेथड बाइंडिंग" भी कहा जाता है। C ++ की तरह, Objective-C कंपाइलर-जनरेटेड फंक्शन पॉइंटर टेबल में निर्भर करता है जो रनटाइम पर ट्रैवर्स किए जाते हैं।

सी ++ के विपरीत, हालांकि, बाध्यकारी विधि अधिक 'गतिशील' है, और idहर जगह सुपरक्लास के उपयोग को बढ़ावा देता है, यह सिद्धांत में सी ++ की तुलना में थोड़ा धीमा बनाता है। व्यवहार में, यह अंतर औसत दर्जे से कम है।

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

TL; DR: यह C और C ++ भाषाओं के साथ वहीं है जहां यह सबसे ज्यादा मायने रखता है। यदि आपको अच्छा प्रदर्शन नहीं मिल रहा है, तो अपने एल्गोरिदम की जांच करें; बस किसी भी गंभीर भाषा में।


4
वास्तव में आधुनिक उद्देश्य-सी आधुनिक सी ++ के रूप में सुपरसेट्टी के रूप में है। C में आपको मनमाने ढंग से पॉइंटर्स पर अंकगणित करने की अनुमति है, आप ObjC में नहीं कर सकते। विधि लुकअप के कारण प्रदर्शन अंतर औसत दर्जे का है: objc_msgSend का तेज़ पथ सदस्य फ़ंक्शन कॉल की तुलना में लगभग चार गुना अधिक भारी है (और धीमे पथ तेज़ पथ की तरह तेज़ नहीं हैं)।

11

ऑब्जेक्टिव- C, C / C ++ से धीमा है। ऑब्जेक्टिव-सी का रनटाइम होने का कारण यह है कि विधियों को गतिशील रूप से स्मालटाक के रूप में उसी तरह से देखता है, जिससे उसने इस निष्पादन मॉडल को लिया है। रनटाइम के सभी तरीकों को डिस्पैच किया जाता है, "सही संदेश भेजता है" को C / C ++ में फ़ंक्शन कॉल के विपरीत कहा जाता है, जहां फ़ंक्शन एड्रेस को संकलन समय पर निर्धारित किया जाता है (C ++ वर्चुअल विधियों को छोड़कर)। लेकिन मैं यह नहीं कह सकता कि उद्देश्य कितना धीमा है। ASAIK का उपयोग केवल प्रदर्शन के दंड के कारण अनुप्रयोग विकास के लिए किया जाता है।


1
C: rmarcus.info/?p=488 के साथ इस प्रदर्शन की तुलना मिली , उद्देश्य-सी की तरह लग रहा है, फिर भी सी के करीब है
OlliP


मुझे लगता है कि प्रदर्शन की तुलना नमक के कुछ टुकड़े के साथ करने की आवश्यकता है क्योंकि ऑब्जेक्टिव-सी कोड कुछ सी कोड बढ़ाता है न कि ऑब्जेक्टिव-सी मैसेज भेजता है। मुझे नहीं पता कि नीचे की ओर क्या है। मैंने एक दशक से अधिक के लिए स्मॉलटाक डेवलपमेंट किया और ऑब्जेक्टिव-सी कई मायनों में स्मॉलटाक पर आधारित है। मुझे लगता है कि मुझे पता है कि मैं किस बारे में बात कर रहा था।
OlliP

डाउनवॉटर नहीं; मैं मुख्य रूप से भारी संख्यात्मक एल्गोरिदम में रुचि रखता हूं, डायनामिक डिस्पैच उन लोगों के भीतर ज्यादा मायने नहीं रखता है
हिरण हंटर

8

संक्षिप्त उत्तर: इसे C / C ++ / D / Go / Rust के समान प्रारूप में संकलित किया गया है। यह जावा / .Net जैसे आभासी वातावरण का उपयोग नहीं करता है। और इसकी व्याख्या पाइथन / रूबी / लुआ / जावास्क्रिप्ट जैसी नहीं है। तो यह स्पेक्ट्रम के तेज अंत पर है।


7

ओब्ल्वर-सी और सी / सी ++ के बीच मौलिक गति अंतर, जैसा कि ओलिवर नीचे कहता है, गतिशील विधि प्रेषण के कारण हैं।

यह लेख इस ओवरहेड को 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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.