2010-04-21 18 views
11

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

उत्तर

11

ब्लॉक रनटाइम बहुत तंग दिखता है। ब्लॉक डिस्क्रिप्टर और फ़ंक्शंस को आवंटित आवंटित किया जाता है, इसलिए वे आपके प्रोग्राम के कामकाजी सेट को बढ़ा सकते हैं, लेकिन आप संलग्न स्कोप से संदर्भित चर के लिए केवल "भुगतान" करते हैं। गैर-वैश्विक ब्लॉक अक्षर और __block किसी भी शाखा के बिना ढेर पर चर का निर्माण किया जाता है, इसलिए आप उससे अधिक मंदी में भागने की संभावना नहीं रखते हैं। ब्लॉक को कॉल करना सिर्फ result = (*b->__FuncPtr)(b, arg1, arg2) है; यह result = (*callback_func_ptr)(callback_ctx, arg1, arg2) से तुलनीय है।

यदि आप ब्लॉक के बारे में सोचते हैं, "कॉलबैक जो अपनी खुद की संदर्भ संरचना लिखते हैं और आपके लिए बदसूरत पैकिंग, मेमोरी प्रबंधन, कास्टिंग और डिफ्रेंसिंग को संभालते हैं," मुझे लगता है कि आपको पता चलेगा कि ब्लॉक रनटाइम पर एक छोटी सी लागत है और प्रोग्रामिंग समय में एक बड़ी बचत।

6

आप this blog post और this one देख सकते हैं। ब्लॉक को ऑब्जेक्टिव-सी ऑब्जेक्ट्स के रूप में कार्यान्वित किया जाता है, सिवाय इसके कि उन्हें स्टैक पर रखा जा सकता है, इसलिए उन्हें malloc 'डी होना जरूरी नहीं है (यदि आप किसी ब्लॉक के संदर्भ को बनाए रखते हैं, तो इसे ढेर पर कॉपी किया जाएगा) । इस प्रकार वे अधिकतर उद्देश्य-सी ऑब्जेक्ट्स से बेहतर प्रदर्शन करेंगे, लेकिन एक साधारण कॉलबैक की तुलना में थोड़ा सा प्रदर्शन होगा - मुझे लगता है कि यह 95% समय की समस्या नहीं होनी चाहिए।

+0

माइक एश पोस्ट पर अच्छी कॉल। – Don

+0

कॉलबैक की तुलना में ब्लॉक के साथ कैप्चरिंग तंत्र का उल्लेख करने के लिए एक बात भी है। –

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