2009-06-23 25 views
8

benim Objective-C uygulamasına bazı otomatik performans testini ekleyin. (Ben sadece bir dizi test çalıştırarak motorun kilit parçalarının mevcut performansını görmek istiyorum böylece bu, bir oyun.) Bazı zamanlama destek rutin, böyle bir şey yazmak istiyorum Bunun için:Zamanlama Objective-C kodu

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

Sorun şu ki, milisaniyelerle ilgileniyorum ve kıyaslama kodunda performSelector numaralı telefonun aranmasının sonuçları biraz çarptığından korkuyorum. Bunu nasıl değiştirirdin? objc_msgSend'a gitmeli miyim?

, gerçek uygulama için bir işlev işaretçisi döndürür şöyle
+0

bu Kakao özgü kod nedir? – Nippysaurus

+0

Emin değilim, muhtemelen değil. – zoul

cevap

12

Kullanım methodForSelector:,: bu strateji bir yöntemin gerçek çalışma zamanını ölçmek için yararlıdır, ama olacaksın eğer

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 
} 

Not standart Objective-C mesaj gönderme sözdizimi ile çağrıldığında, ölçümlerinizde iletiyi geçen ek yükü içermekle alakalı olabilir.

Ayrıca, yöntem aslında başka parametre alır eğer, daha fazla bilgi için NSObject Class Reference bakınız, uygun parametrelerle bir işlev işaretçisi methodForSelector: sonucunu kullanması gereklidir çiftlerde, vb için şamandıraların beklenmedik dönüşümünü önlemek için dikkat ve örnekler.

+0

İleti aktarma ek yükünü dahil etme konusunda haklısınız, ancak performSelector öğesinin iletiyi göndermekten çok daha uzun bir süre alabileceği konusunda endişeliydim. Kodu yazdıktan sonra o kadar da kötü görünmüyor - ve eğer istersem, her zaman IMP'ye geri dönebiliyordum. Teşekkür ederim. siz) (= mach_absolute_time başlatmak uint64_t kullanıldığında – zoul

+0

daha iyi sonuçlar elde olmaz; uint64_t duration = mach_absolute_time() - başlat; saniye yerine nanosaniye verir misiniz? – micmoo

+2

NSTimeInterval bir çifttir. Sonuç saniye cinsinden ifade edilir, ancak milisaniye cinsinden hassasiyete sahiptir. OP milisaniye aradığı için bence yeterince iyi. Ama evet, mach_absolute_time() da işe yarayacaktı. –