2009-06-23 15 views
8

Vorrei aggiungere alcuni test delle prestazioni automatizzati alla mia applicazione Objective-C. (Questo è un gioco, quindi mi piacerebbe vedere le prestazioni attuali delle parti principali del motore semplicemente eseguendo una serie di test.) Per fare ciò, desidero scrivere alcune routine di supporto di temporizzazione, qualcosa come:Timing Objective-C code

Il problema è che sono interessato ai millisecondi e temo che chiamare il codice di benchmarkingpossa distorcere i risultati un po '. Come andresti in giro questo? Devo andare a objc_msgSend?

+0

è questo codice specifico del cacao? – Nippysaurus

+0

Non sono sicuro, probabilmente no. – zoul

risposta

12

Usa methodForSelector:, che restituisce un puntatore a funzione alla realizzazione vera e propria, in questo modo:

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 
} 

Si noti che questa strategia è utile per misurare il tempo di esecuzione reale di un metodo, ma se si sta andando ad essere chiamandolo con la sintassi di passaggio del messaggio Objective-C standard, quindi potrebbe essere altrettanto rilevante per includere il sovraccarico del messaggio nelle vostre misurazioni.

Si noti inoltre che se il metodo richiede in realtà tutti gli altri parametri, si dovrebbe lanciare il risultato di methodForSelector: ad un puntatore a funzione con i parametri appropriati, per evitare imprevisti di conversione dei carri allegorici a doppie, ecc Vedere la NSObject Class Reference per ulteriori informazioni ed esempi

+0

Hai ragione a includere il sovraccarico del messaggio, ma ero preoccupato che performSelector: potrebbe richiedere "molto" più tempo rispetto all'invio del messaggio. Dopo aver scritto il codice non sembra poi così male - e se volessi, potrei sempre tornare all'IMP. Grazie. – zoul

+0

Non otterresti risultati migliori se hai usato uint64_t start = mach_absolute_time(); uint64_t duration = mach_absolute_time() - start; che ti dà nanosecondi invece di secondi? – micmoo

+2

NSTimeInterval è un doppio. Il risultato è espresso in termini di secondi, ma ha una precisione inferiore al millisecondo. Dal momento che l'OP sta cercando millisecondi, penso che sia abbastanza buono. Ma sì, anche mach_absolute_time() funzionerebbe. –