Получение более точного измерения времени - PullRequest
1 голос
/ 26 августа 2011

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

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 ]

6 голосов
/ 26 августа 2011

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

CFAbsoluteTime startTime = CFAbsoluteTimeGetCurrent();

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

elapsed = CFAbsoluteTimeGetCurrent() - startTime;

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

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

2 голосов
/ 26 августа 2011

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

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

1 голос
/ 26 августа 2011

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

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

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

0 голосов
/ 29 мая 2013

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

...