Question

J'aimerais ajouter un test de performance automatisé à mon application Objective-C. (C’est un & nbsp; jeu, de sorte que j’aimerais voir les performances actuelles des parties clés du moteur en exécutant simplement une série de tests.) Pour ce faire, je souhaite écrire une routine de support de synchronisation, comme ceci:

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

Le problème est que je m'intéresse aux millisecondes et je crains que l'appel de performSelector dans le code d'analyse comparative fausse un peu les résultats. Comment ferais-tu ça? Dois-je descendre à objc_msgSend ?

Était-ce utile?

La solution

Utilisez methodForSelector: , qui renvoie un pointeur de fonction sur l'implémentation réelle, comme suit:

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
}

Notez que cette stratégie est utile pour mesurer le temps d’exécution réel d’une méthode, mais si vous voulez l’appeler avec la syntaxe standard de transmission de messages Objective-C, il pourrait être tout aussi pertinent d’inclure le message- passant au-dessus de vos mesures.

Notez également que si la méthode utilise d'autres paramètres, vous devez convertir le résultat de methodForSelector: en un pointeur de fonction avec les paramètres appropriés, afin d'éviter toute conversion inattendue de floats en doubles, etc. . Voir le Référence de la classe NSObject pour plus d'informations et d'exemples.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top