فرق الأداء بين تدوين النقطة واستدعاء الطريقة في Objective-C

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

  •  09-06-2019
  •  | 
  •  

سؤال

يمكنك استخدام تدوين نقطي قياسي أو استدعاء أسلوب في Objective-C للوصول إلى خاصية كائن في Objective-C.

myObject.property = YES;

أو

[myObject setProperty:YES];

هل هناك اختلاف في الأداء (من حيث الوصول إلى العقار)؟هل هي مجرد مسألة تفضيل من حيث أسلوب الترميز؟

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

المحلول

تدوين نقطي للوصول إلى الخاصية في Objective-C يكون إرسال رسالة، تماما كما تدوين قوس.أي بالنظر إلى هذا:

@interface Foo : NSObject
@property BOOL bar;
@end

Foo *foo = [[Foo alloc] init];
foo.bar = YES;
[foo setBar:YES];

سيتم تجميع السطرين الأخيرين بنفس الطريقة تمامًا.الشيء الوحيد الذي يغير هذا هو إذا كان العقار لديه getter و/أو setter السمة المحددة؛ومع ذلك، كل ما يفعله هو تغيير الرسالة التي سيتم إرسالها، وليس ما إذا كانت الرسالة قد تم إرسالها أم لا:

@interface MyView : NSView
@property(getter=isEmpty) BOOL empty;
@end

if ([someView isEmpty]) { /* ... */ }
if (someView.empty) { /* ... */ }

سيتم تجميع كلا السطرين الأخيرين بشكل متطابق.

نصائح أخرى

الدفع مقالة من الكاكاو هي صديقتي.جوهر ذلك هو أنه لا توجد عقوبة أداء لاستخدام أحدهما على الآخر.

ومع ذلك، فإن الترميز يزيد من صعوبة رؤية ما يحدث مع متغيراتك وما هي متغيراتك.

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

وبالتالي ربما تريد في الغالب تحديد خاصية مثل:

@property (غير ذرية، الاحتفاظ) NSString *myProp;

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

نمط يجب أن تكون على دراية به:إذا قمت بتعريف أداة الضبط بنفسك (بدلاً من السماح لـsynthesize بإنشائها) وبدأت في إحداث آثار جانبية أخرى لتعيين قيمة، فمن المحتمل أن تجعل أداة الضبط طريقة عادية بدلاً من الاتصال باستخدام تدوين الخاصية.

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

بقدر ما رأيت، لا يوجد فرق كبير في الأداء بين الاثنين.أنا متأكد بشكل معقول أنه في معظم الحالات سيتم "تجميعها" وصولاً إلى نفس الكود.

إذا لم تكن متأكدًا، فحاول كتابة تطبيق اختباري يقوم بكل طريقة مليون مرة أو نحو ذلك، مع تحديد الوقت الذي يستغرقه الأمر.هذه هي الطريقة الوحيدة للتأكد (على الرغم من أنها قد تختلف باختلاف البنية).

اقرأ أيضًا منشور المدونة هذا على Cocoa with Love:

http://cocoawithlove.com/2008/06/speed-test-nsmanagedobject-objc-20.html

هناك يقارن المؤلف سرعة الوصول المخصص والملاحظات النقطية لـ NSManagedObject، ولا يجد أي فرق.ومع ذلك، يبدو أن الوصول إلى KVC (setValue:forKey:) أبطأ بمقدار الضعف تقريبًا.

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