Pregunta

Me gustaría agregar alguna prueba de rendimiento automatizada a mi aplicación Objective-C. (Este es un & nbsp; juego, por lo que me gustaría ver el rendimiento actual de las partes clave del motor simplemente ejecutando un conjunto de pruebas). Para hacer esto, quiero escribir una rutina de soporte de sincronización, algo como esto:

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

El problema es que estoy interesado en milisegundos y me temo que llamar a performSelector en el código de evaluación comparativa sesgaría bastante los resultados. ¿Cómo solucionarías esto? ¿Debo ir a objc_msgSend ?

¿Fue útil?

Solución

Use methodForSelector: , que devuelve un puntero de función a la implementación real, así:

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
}

Tenga en cuenta que esta estrategia es útil para medir el tiempo de ejecución real de un método, pero si va a llamarlo con la sintaxis estándar de paso de mensajes Objective-C, entonces podría ser tan relevante incluir el mensaje- pasando sobre sus medidas.

Además, tenga en cuenta que si el método realmente toma otros parámetros, debe convertir el resultado de methodForSelector: a un puntero de función con los parámetros apropiados, para evitar la conversión inesperada de flotantes a dobles, etc. Consulte el Referencia de clase de NSObject para obtener más información y ejemplos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top