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

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

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 собственность или еще много чего, но я не смог найти.

Спасибо!

4 ответа

Решение

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

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

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

elapsed = CFAbsoluteTimeGetCurrent() - startTime;

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

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

Почему бы просто не использовать 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];

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

Если вы хотите получить Unix-у, вы можете использовать gettimeofday ( ссылка):

struct timeval tv;
gettimeofday(&tv, NULL);
NSLog(@"seconds: %d, microseconds: %d\n", tv.tv_sec, tv.tv_usec);

Обязательно добавлю #import <sys/time.h> в ваш файл

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

Другие вопросы по тегам