ما هو الفرق في الأداء بين الكتل والاسترجاعات؟

StackOverflow https://stackoverflow.com/questions/2680292

  •  30-09-2019
  •  | 
  •  

سؤال

أحد الأشياء التي تمنع الكائنات ، التي تم تقديمها في Snow Leopard ، جيدة للمواقف التي كان من الممكن التعامل معها من قبل مع عمليات الاسترجاعات. بناء الجملة أكثر نظافة لتمرير السياق حولها. ومع ذلك ، لم أر أي معلومات عن الآثار المترتبة على الأداء لاستخدام الكتل بهذه الطريقة. ما الذي يجب علي ، إن وجدت ، أن أبحث عنه عند استخدام الكتل ، خاصة كبديل لاستدعاء على طراز C؟

هل كانت مفيدة؟

المحلول

الكتل وقت التشغيل تبدو ضيقة جدا. يتم تخصيص الواصفات والوظائف الحظر بشكل ثابت ، بحيث يمكنها توسيع مجموعة العمل في البرنامج الخاص بك ، لكنك "تدفع" فقط في التخزين للمتغيرات التي تشير إليها من النطاق المرفق. حرفيات الكتل غير العلادة و __block يتم إنشاء المتغيرات على المكدس دون أي تفرع ، لذلك من غير المرجح أن تواجه الكثير من التباطؤ من ذلك. استدعاء الكتلة هو فقط result = (*b->__FuncPtr)(b, arg1, arg2); ؛ هذا مماثل result = (*callback_func_ptr)(callback_ctx, arg1, arg2).

إذا كنت تفكر في الكتل على أنها "عمليات الاسترجاعات التي تكتب بنية السياق الخاصة بها وتعالج التعبئة القبيحة ، وإدارة الذاكرة ، والكسب ، وإلغاء التخلص منك" ، أعتقد أنك ستدرك أن الكتل هي تكلفة صغيرة في وقت التشغيل وتوفير ضخم في وقت البرمجة.

نصائح أخرى

قد ترغب في التحقق منشور المدونة هذا و هذا. يتم تنفيذ الكتل ككائنات Objective-C ، إلا أنه يمكن وضعها على المكدس ، لذلك لا يجب أن تكون بالضرورة malloc'D (إذا احتفظت بالإشارة إلى كتلة ، فسيتم نسخها على الكومة ، على الرغم من). وبالتالي ، فإنهم سيؤدون أداء أفضل من معظم كائنات GOIGIVE-C ، ولكن سيكون لديهم أداء بسيط مقارنةً بالاستدعاء البسيط-أعتقد أنه لا ينبغي أن يكون مشكلة 95 ٪ من الوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top