سؤال

أرغب في إضافة بعض اختبار الأداء الآلي إلى تطبيق 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 لمزيد من المعلومات والأمثلة.

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