Получение более точного измерения времени
В настоящее время я записываю время между двумя событиями в десятичных минутах, используя:
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>
в ваш файл