2009-06-23 14 views
8

मैं अपने उद्देश्य-सी अनुप्रयोग में कुछ स्वचालित प्रदर्शन परीक्षण जोड़ना चाहता हूं। (यह एक गेम है, ताकि मैं बस परीक्षण के सेट को चलाकर इंजन के प्रमुख हिस्सों के वर्तमान प्रदर्शन को देखना चाहूंगा।) ऐसा करने के लिए मैं कुछ समय समर्थन दिनचर्या लिखना चाहता हूं, इस तरह कुछ:समय उद्देश्य-सी कोड

- (void) benchmarkSelector: (SEL) msg onObject: (id) target 
{ 
    // run the selector thousands of times, print detailed stats 
} 

समस्या यह है कि मुझे मिलीसेकंड में दिलचस्पी है और मुझे डर है कि बेंचमार्किंग कोड में performSelector पर कॉल करने से परिणाम थोड़ा सा हो जाएंगे। आप इसके आसपास कैसे जाएंगे? क्या मुझे objc_msgSend पर जाना चाहिए?

+0

यह कोको विशिष्ट कोड है? – Nippysaurus

+0

मुझे यकीन नहीं है, शायद नहीं। – zoul

उत्तर

12

उपयोग 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 
} 

नोट इस रणनीति के लिए एक विधि की वास्तविक क्रम मापने के लिए उपयोगी है, लेकिन आप होने के लिए जा रहे हैं कि मानक उद्देश्य-सी संदेश-पासिंग सिंटैक्स के साथ इसे कॉल करना, तो यह आपके माप में संदेश-पासिंग ओवरहेड को शामिल करने के लिए उतना ही प्रासंगिक हो सकता है।

इसके अलावा, ध्यान दें कि यदि विधि वास्तव में किसी अन्य पैरामीटर लेता है, तो आप परिणाम methodForSelector: के एक समारोह सूचक के लिए उपयुक्त मानकों के साथ, कच्चा युगल, आदि के लिए तैरता की अप्रत्याशित रूपांतरण से बचने के लिए चाहिए और जानकारी के लिए NSObject Class Reference देखें और उदाहरण।

+0

आप संदेश-पासिंग ओवरहेड को शामिल करने के बारे में सही हैं, लेकिन मुझे चिंता थी कि प्रदर्शन चयनकर्ता: संदेश भेजने से 'बहुत अधिक' ले सकता है। कोड लिखने के बाद यह बुरा नहीं दिखता है - और यदि मैं चाहता था, तो मैं हमेशा आईएमपी पर वापस आ सकता था। धन्यवाद। – zoul

+0

यदि आप uint64_t start = mach_absolute_time() प्रारंभ करते हैं तो आपको बेहतर परिणाम नहीं मिलेंगे; uint64_t अवधि = mach_absolute_time() - शुरू करें; जो आपको सेकंड के बजाय नैनोसेकंड देता है? – micmoo

+2

एनएसटीइम इंटरवल एक डबल है। परिणाम सेकंड के संदर्भ में व्यक्त किया जाता है, लेकिन उप-मिलीसेकंद परिशुद्धता है। चूंकि ओपी मिलीसेकंड की तलाश में है, मुझे लगता है कि यह काफी अच्छा है। लेकिन हाँ, mach_absolute_time() भी काम करेगा। –

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