programación programacion objective lenguaje entre diferencias iphone objective-c cocoa-touch uikit
MMStopwatch.zip

iphone - programacion - objective c vs swift



¿Cómo puedo obtener un tiempo preciso, por ejemplo en milisegundos en Objective-C? (10)

Además, aquí se explica cómo calcular un NSNumber 64 bits inicializado con la época de Unix en milisegundos, en caso de que así sea como desee almacenarlo en CoreData. Lo necesitaba para mi aplicación, que interactúa con un sistema que almacena las fechas de esta manera.

+ (NSNumber*) longUnixEpoch { return [NSNumber numberWithLongLong:[[NSDate date] timeIntervalSince1970] * 1000]; }

¿Hay alguna manera fácil de obtener un tiempo de manera muy precisa?

Necesito calcular algunas demoras entre las llamadas al método. Más específicamente, quiero calcular la velocidad de desplazamiento en UIScrollView.


NO usaría mach_absolute_time() porque consulta una combinación del kernel y el procesador durante un tiempo absoluto usando ticks (probablemente un tiempo de actividad).

Lo que usaría:

CFAbsoluteTimeGetCurrent();

Esta función está optimizada para corregir la diferencia en el software y hardware iOS y OSX.

Algo más geek

El cociente de una diferencia en mach_absolute_time() y AFAbsoluteTimeGetCurrent() siempre es alrededor de 24000011.154871

Aquí hay un registro de mi aplicación:

Tenga en cuenta que el tiempo de resultado final es una diferencia en CFAbsoluteTimeGetCurrent() ''s

2012-03-19 21:46:35.609 Rest Counter[3776:707] First Time: 353900795.609040 2012-03-19 21:46:36.360 Rest Counter[3776:707] Second Time: 353900796.360177 2012-03-19 21:46:36.361 Rest Counter[3776:707] Final Result Time (difference): 0.751137 2012-03-19 21:46:36.363 Rest Counter[3776:707] Mach absolute time: 18027372 2012-03-19 21:46:36.365 Rest Counter[3776:707] Mach absolute time/final time: 24000113.153295 2012-03-19 21:46:36.367 Rest Counter[3776:707] ----------------------------------------------------- 2012-03-19 21:46:43.074 Rest Counter[3776:707] First Time: 353900803.074637 2012-03-19 21:46:43.170 Rest Counter[3776:707] Second Time: 353900803.170256 2012-03-19 21:46:43.172 Rest Counter[3776:707] Final Result Time (difference): 0.095619 2012-03-19 21:46:43.173 Rest Counter[3776:707] Mach absolute time: 2294833 2012-03-19 21:46:43.175 Rest Counter[3776:707] Mach absolute time/final time: 23999753.727777 2012-03-19 21:46:43.177 Rest Counter[3776:707] ----------------------------------------------------- 2012-03-19 21:46:46.499 Rest Counter[3776:707] First Time: 353900806.499199 2012-03-19 21:46:55.017 Rest Counter[3776:707] Second Time: 353900815.016985 2012-03-19 21:46:55.018 Rest Counter[3776:707] Final Result Time (difference): 8.517786 2012-03-19 21:46:55.020 Rest Counter[3776:707] Mach absolute time: 204426836 2012-03-19 21:46:55.022 Rest Counter[3776:707] Mach absolute time/final time: 23999996.639500 2012-03-19 21:46:55.024 Rest Counter[3776:707] -----------------------------------------------------


No utilice NSDate , CFAbsoluteTimeGetCurrent ni gettimeofday para medir el tiempo transcurrido. Todo esto depende del reloj del sistema, que puede cambiar en cualquier momento debido a muchas razones diferentes, como sincronización de tiempo de red (NTP) actualizando el reloj (sucede a menudo para ajustar la deriva), ajustes de horario de verano, segundos intercalares, etc.

Esto significa que si estás midiendo tu velocidad de carga o descarga, obtendrás picos o caídas repentinas en tus números que no se correlacionan con lo que realmente sucedió; sus pruebas de rendimiento tendrán extraños atípicos incorrectos; y sus temporizadores manuales se dispararán después de duraciones incorrectas. El tiempo puede incluso ir hacia atrás, y terminas con deltas negativos, y puedes terminar con recursión infinita o código muerto (sí, he hecho ambas cosas).

Use mach_absolute_time . Mide los segundos reales desde que se inició el kernel. Aumenta monótonamente (nunca irá hacia atrás) y no se ve afectado por la configuración de fecha y hora. Ya que es un dolor trabajar con él, aquí hay un envoltorio simple que te da NSTimeInterval s:

// LBClock.h @interface LBClock : NSObject + (instancetype)sharedClock; // since device boot or something. Monotonically increasing, unaffected by date and time settings - (NSTimeInterval)absoluteTime; - (NSTimeInterval)machAbsoluteToTimeInterval:(uint64_t)machAbsolute; @end // LBClock.m #include <mach/mach.h> #include <mach/mach_time.h> @implementation LBClock { mach_timebase_info_data_t _clock_timebase; } + (instancetype)sharedClock { static LBClock *g; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ g = [LBClock new]; }); return g; } - (id)init { if(!(self = [super init])) return nil; mach_timebase_info(&_clock_timebase); return self; } - (NSTimeInterval)machAbsoluteToTimeInterval:(uint64_t)machAbsolute { uint64_t nanos = (machAbsolute * _clock_timebase.numer) / _clock_timebase.denom; return nanos/1.0e9; } - (NSTimeInterval)absoluteTime { uint64_t machtime = mach_absolute_time(); return [self machAbsoluteToTimeInterval:machtime]; } @end


Para aquellos que necesitamos la versión Swift de la respuesta de @Jeff Thompson:

// Get a current time for where you want to start measuring from var date = NSDate() // do work... // Find elapsed time and convert to milliseconds // Use (-) modifier to conversion since receiver is earlier than now var timePassed_ms: Double = date.timeIntervalSinceNow * -1000.0

Espero que esto te ayude.


Puede obtener la hora actual en milisegundos desde el 1 de enero de 1970 utilizando un NSDate:

- (double)currentTimeInMilliseconds { NSDate *date = [NSDate date]; return [date timeIntervalSince1970]*1000; }


Sé que esta es una antigua, pero incluso me encontré deambulando por ella nuevamente, así que pensé en enviar mi propia opción aquí.

La mejor apuesta es consultar la publicación de mi blog sobre esto: Cosas de tiempo en Objective-C: un cronómetro

Básicamente, escribí una clase que deja de mirar de una manera muy básica, pero está encapsulada, por lo que solo necesita hacer lo siguiente:

[MMStopwatchARC start:@"My Timer"]; // your work here ... [MMStopwatchARC stop:@"My Timer"];

Y terminas con:

MyApp[4090:15203] -> Stopwatch: [My Timer] runtime: [0.029]

en el registro ...

De nuevo, revisa mi publicación por un poco más o descárgala aquí: MMStopwatch.zip


CFAbsoluteTimeGetCurrent() devuelve el tiempo absoluto como un valor double , pero no sé cuál es su precisión: puede que solo se actualice cada docena de milisegundos, o podría actualizar cada microsegundo, no sé.


NSDate y timeIntervalSince* devolverán un NSTimeInterval que es un doble con una precisión inferior a milisegundos. NSTimeInterval está en segundos, pero usa el doble para darle una mayor precisión.

Para calcular la precisión del tiempo en milisegundos, puede hacer:

// Get a current time for where you want to start measuring from NSDate *date = [NSDate date]; // do work... // Find elapsed time and convert to milliseconds // Use (-) modifier to conversion since receiver is earlier than now double timePassed_ms = [date timeIntervalSinceNow] * -1000.0;

Documentación sobre timeIntervalSinceNow .

Hay muchas otras maneras de calcular este intervalo utilizando NSDate , y recomendaría consultar la documentación de clase para NSDate que se encuentra en NSDate Class Reference .


mach_absolute_time() se puede usar para obtener mediciones precisas.

Ver http://developer.apple.com/qa/qa2004/qa1398.html

También está disponible CACurrentMediaTime() , que es esencialmente lo mismo pero con una interfaz más fácil de usar.


#define CTTimeStart() NSDate * __date = [NSDate date] #define CTTimeEnd(MSG) NSLog(MSG " %g",[__date timeIntervalSinceNow]*-1)

Uso:

CTTimeStart(); ... CTTimeEnd(@"that was a long time:");

Salida:

2013-08-23 15:34:39.558 App-Dev[21229:907] that was a long time: .0023