Получение более точного измерения времени

В настоящее время я записываю время между двумя событиями в десятичных минутах, используя:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDate *date = [NSDate date];
NSDateComponents *dateComponents =  [calendar components:unitFlags fromDate:date];

CGFloat hour = [dateComponents hour];
CGFloat minute = [dateComponents minute];
CGFloat second = [dateComponents second];

//set start time in decimal minutes
CGFloat startTime = ((hour*3600.0)+(minute*60.0)+(second))*.016666;

//do work...

//set end time in decimal minutes
CGFloat endTime = ((hour*3600.0)+(minute*60.0)+(second))*.016666;

//calculate time elapsed in decimal minutes
CGFloat totalTime = endTime-startTime;

Проблема, с которой я сталкиваюсь, заключается в том, что я действительно получаю время только в секундах, а затем конвертирую в десятичные минуты. Итак, единственные значения, которые я получаю, это 0.016663 (одна секунда в десятичных минутах), 0.033325 (две секунды в десятичных минутах), 0.049988 (три секунды в десятичных минутах) и т. д. Я не получаю никаких промежуточных значений. Есть ли способ получить более точное время? Я проверил, есть ли у NSDateComponents свойство millisecond или еще что-то, но ничего не нашел.

Спасибо!


person hemlocker    schedule 25.08.2011    source источник


Ответы (4)


Вы также можете использовать CFAbsoluteTimeGetCurrent() который возвращает значение типа double, содержащее время в секундах и долях секунды:

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

Затем позже вы можете вычислить прошедшее время в секундах и долях секунды:

elapsed = CFAbsoluteTimeGetCurrent() - startTime;

NSLog(@"Elapsed Time: %0.3f seconds", elapsed);

Мне нравится иметь код отладки (#ifdef DEBUG) в моем делегате приложения и в viewDidAppear в моем первом контроллере представления, чтобы сообщать об истекшем времени запуска, чтобы я мог следить за этим во время разработки.

person progrmr    schedule 25.08.2011
comment
В презентации Apple о производительности приложения на WWDC 2012 рекомендуется сохранить приложение. время начала в main, а затем запись различий в блоке dispatch_get_main_queue внутри applicationDidFinishLaunching. Хотя мне больше нравится ваше решение viewDidAppear :-) - person AlexChaffee; 24.04.2013

Почему бы просто не использовать NSDate?

NSDate *date1, *date2;
NSTimeInterval timeInSeconds;

date1 = [NSDate date];

// Do work

date2 = [NSDate date];
timeInSeconds = [date2 timeIntervalSinceDate:date1];

// Or, without using date2:

timeInSeconds = -[date1 timeIntervalSinceNow];

Это должно дать точность ваших измерений в доли секунды.

person Cameron Spickert    schedule 25.08.2011


Или, если вы действительно хотите спустить металл, вы можете использовать mach_absolute_time() в соответствии с этим SO Q/A и/или документы Apple.

person Clay Bridges    schedule 29.05.2013