توقيت كود الهدف-C
-
06-07-2019 - |
سؤال
أرغب في إضافة بعض اختبار الأداء الآلي إلى تطبيق Objective-C. (هذه لعبة ، بحيث أرغب في رؤية الأداء الحالي للأجزاء الرئيسية للمحرك ببساطة عن طريق إجراء مجموعة من الاختبارات.) للقيام بذلك ، أريد أن أكتب بعض روتين دعم التوقيت ، شيء من هذا القبيل:
- (void) benchmarkSelector: (SEL) msg onObject: (id) target
{
// run the selector thousands of times, print detailed stats
}
المشكلة هي أنني مهتم بالمللي ثانية وأخشى أن الدعوة performSelector
في رمز القياس من شأنه أن يشوه النتائج قليلاً. كيف تدور حول هذا؟ هل يجب علي النزول إلى objc_msgSend
?
المحلول
يستخدم methodForSelector:
, ، الذي يعيد مؤشر الوظيفة إلى التنفيذ الفعلي ، مثل ذلك:
IMP methodImp = [target methodForSelector:msg];
for (int i=0; i<1000; ++i) {
NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
methodImp(target, msg);
NSTimeInterval duration = [NSDate timeIntervalSinceReferenceDate] - start;
// Do something with duration
}
لاحظ أن هذه الاستراتيجية مفيدة لقياس وقت التشغيل الفعلي للطريقة ، ولكن إذا كنت ستسميها ببناء بناء رسائل Objective-C القياسي ، فقد يكون الأمر بنفس الصلة لتضمين النفقات العامة التي تحمل الرسائل في قياساتك.
لاحظ أيضًا أنه إذا كانت الطريقة تأخذ بالفعل أي معلمات أخرى ، فيجب عليك إلقاء نتيجة methodForSelector:
إلى مؤشر وظيفة مع المعلمات المناسبة ، لتجنب التحويل غير المتوقع للعوامات إلى الزوجي ، وما إلى ذلك ، انظر مرجع فئة NSOBject لمزيد من المعلومات والأمثلة.