Domanda

Vorrei aggiungere alcuni test prestazionali automatizzati alla mia applicazione Objective-C. (Questo è un gioco & nbsp ;, in modo che mi piacerebbe vedere le prestazioni attuali delle parti chiave del motore semplicemente eseguendo una serie di test.) Per fare ciò, voglio scrivere una routine di supporto alla temporizzazione, qualcosa del genere:

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

Il problema è che sono interessato ai millisecondi e temo che la chiamata di performSelector nel codice di benchmarking distorcerebbe un po 'i risultati. Come lo aggireresti? Dovrei andare su objc_msgInvia ?

È stato utile?

Soluzione

Usa methodForSelector: , che restituisce un puntatore a funzione per l'implementazione effettiva, 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
}

Nota che questa strategia è utile per misurare il runtime effettivo di un metodo, ma se lo chiamerai con la sintassi standard di passaggio dei messaggi Objective-C, potrebbe essere altrettanto rilevante includere il messaggio- passando sopra le tue misure.

Inoltre, tieni presente che se il metodo accetta effettivamente altri parametri, dovresti trasmettere il risultato di methodForSelector: in un puntatore a funzione con i parametri appropriati, per evitare la conversione imprevista di float in double, ecc. Vedi Riferimento classe NSObject per ulteriori informazioni ed esempi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top