Как точно определить время, необходимое для вызова функции на iPhone? - PullRequest
9 голосов
/ 15 марта 2009

Я хотел бы знать, сколько времени занимает отправка сообщения объекту с точностью не менее 1 мс. Как мне это сделать?

Ответы [ 3 ]

15 голосов
/ 15 марта 2009

Вы можете использовать mach_absolute_time для измерения в наносекундах.

#import <mach/mach_time.h>

uint64_t startTime = 0;
uint64_t endTime = 0;
uint64_t elapsedTime = 0;
uint64_t elapsedTimeNano = 0;

mach_timebase_info_data_t timeBaseInfo;
mach_timebase_info(&timeBaseInfo);

startTime = mach_absolute_time();

//do something here

endTime = mach_absolute_time();

elapsedTime = endTime - startTime;
elapsedTimeNano = elapsedTime * timeBaseInfo.numer / timeBaseInfo.denom;

Ссылка: Технические вопросы и ответы QA1398: Единицы абсолютного времени Маха

11 голосов
/ 15 марта 2009

Вот что я делаю:

NSDate * start = [NSDate date];
// do whatever I need to time
NSLog(@"time took: %f", -[start timeIntervalSinceNow]);

Вывод будет в секундах (с десятичной частью). NSDate s имеют разрешение в масштабе миллисекунд, хотя я не уверен точно, насколько они точны.

Если код, который вы пытаетесь рассчитать, слишком быстрый, поместите его в цикл, который выполняет код сто раз. (Это предполагает, конечно, что код, который вы синхронизируете, не имеет побочных эффектов.)

0 голосов
/ 02 ноября 2016

Используйте dispatch_benchmark для записи времени выполнения метода в наносекундах.
Он имеет гораздо более приятный синтаксис, чем ручной цикл и вызов mach_absolute_time () dispatch_benchmark - часть Grand Central Dispatch Эта функция не объявлена ​​публично, поэтому вам придется сделать это самостоятельно перед использованием:

extern uint64_t dispatch_benchmark(size_t count, void (^block)(void));

Я использую это для времени выполнения журнала:

size_t const  blockIterations = 1; //block call count
uint64_t t = dispatch_benchmark(blockIterations, ^{ //your code inside block
        [self TEST_processJSONDataRecordsWithCompletionHandler:^(id handler) {}];
    });
NSLog(@" Avg. Runtime in nanoseconds : %llu ns", t);

Кредит идет на Бенчмаркинг

...