7 ответов:
NSDate *start = [NSDate date]; // do stuff... NSTimeInterval timeInterval = [start timeIntervalSinceNow];
timeInterval- это разница между start и now, в секундах,с точностью до миллисекунды.
вы не должны полагаться на
[NSDate date]для целей синхронизации, так как он может более или менее сообщить о прошедшем времени. Есть даже случаи, когда ваш компьютер будет, Казалось бы, путешествие во времени, так как прошедшее время будет отрицательным! (Например, если часы двигались назад во время синхронизации.)согласно арии Хагиги в лекции "расширенное распознавание жестов iOS"зима 2013 Стэнфорд iOS курс (34:00), вы должны использовать
CACurrentMediaTime()если вам нужен точный временной интервал.Цель-C:
#import <QuartzCore/QuartzCore.h>CFTimeInterval startTime = CACurrentMediaTime(); // perform some action CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime;Swift:
let startTime = CACurrentMediaTime() // perform some action let elapsedTime = CACurrentMediaTime() - startTimeпричина в том, что
[NSDate date]синхронизация на сервере, так что это может привести к "время синхронизации икоты", которые могут привести к очень трудно отслеживать ошибки.CACurrentMediaTime(), С другой стороны, это время устройства, которое не меняется с этими сетевыми синхронизациями.вам понадобится добавить the QuartzCore framework настройки вашей цели.
использовать
timeIntervalSinceDateметодNSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate];
NSTimeInterval- простоdouble, определить вNSDateтакой:typedef double NSTimeInterval;
для тех, кто приходит сюда в поисках реализации getTickCount () для iOS, вот мой после объединения различных источников:
#include <mach/mach.h> #include <mach/mach_time.h> uint64_t getTickCount(void) { static mach_timebase_info_data_t sTimebaseInfo; uint64_t machTime = mach_absolute_time(); // Convert to nanoseconds - if this is the first time we've run, get the timebase. if (sTimebaseInfo.denom == 0 ) { (void) mach_timebase_info(&sTimebaseInfo); } // Convert the mach time to milliseconds uint64_t millis = ((machTime / 1000000) * sTimebaseInfo.numer) / sTimebaseInfo.denom; return millis; }
для измерения времени percise (например, GetTickCount), также взгляните на mach_absolute_time и это Apple Q&A:http://developer.apple.com/qa/qa2004/qa1398.html.
используйте функцию timeIntervalSince1970 класса NSDate, как показано ниже:
double start = [startDate timeIntervalSince1970]; double end = [endDate timeIntervalSince1970]; double difference = end - start;в основном, это то, что я использую для сравнения разницы в секундах между 2 разными датами. также проверьте эту ссылку здесь
остальные ответы верны (с оговоркой*). Я добавляю этот ответ просто, чтобы показать пример использования:
- (void)getYourAffairsInOrder { NSDate* methodStart = [NSDate date]; // Capture start time. // … Do some work … NSLog(@"DEBUG Method %s ran. Elapsed: %f seconds.", __func__, -([methodStart timeIntervalSinceNow])); // Calculate and report elapsed time. }на консоли отладчика вы видите что-то вроде этого:
DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds.
*предостережение: как уже упоминалось, используйте
NSDateдля расчета затраченного времени только для случайных целей. Одной из таких целей может быть общее тестирование, грубое профилирование, где вам просто нужно приблизительное представление о том, сколько времени занимает метод.риск заключается в том, что устройства текущая настройка времени часов может измениться в любой момент из-за синхронизации сетевых часов. Так что
NSDateвремя может прыгать вперед или назад в любой момент.
Comments