Сроки Objective-C код - PullRequest
       19

Сроки Objective-C код

8 голосов
/ 23 июня 2009

Я хотел бы добавить какой-нибудь автоматический тест производительности в свое приложение Objective-C. (Это игра, поэтому я хотел бы увидеть текущую производительность ключевых частей движка, просто запустив ряд тестов.) Для этого я хочу написать некоторую подпрограмму поддержки синхронизации, что-то вроде этого:

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

Проблема в том, что меня интересуют миллисекунды, и я боюсь, что вызов performSelector в коде сравнительного анализа может немного исказить результаты. Как бы вы обойти это? Должен ли я пойти до objc_msgSend?

1 Ответ

11 голосов
/ 23 июня 2009

Используйте methodForSelector:, который возвращает указатель функции на фактическую реализацию, например:

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
}

Обратите внимание, что эта стратегия полезна для измерения фактического времени выполнения метода, но если вы собираетесь вызывать его со стандартным синтаксисом передачи сообщений Objective-C, то может быть также уместно включить сообщение- превышение ваших измерений.

Также обратите внимание, что если метод на самом деле принимает какие-либо другие параметры, вы должны привести результат methodForSelector: к указателю функции с соответствующими параметрами, чтобы избежать непредвиденного преобразования чисел с плавающей запятой в двойные и т. Д. См. Ссылка на класс NSObject для получения дополнительной информации и примеров.

...