2009-04-12 10 views

Respuesta

254
NSDate *start = [NSDate date]; 
// do stuff... 
NSTimeInterval timeInterval = [start timeIntervalSinceNow]; 

timeInterval es la diferencia entre el inicio y ahora, en segundos, con una precisión sub-milisegundo.

+1

+1, Nice and East Answer. Gracias. :) – mAc

+5

por lo que es un valor negativo si entendí correctamente –

+18

@NicolasZozol puede usar 'fabs (...)' para obtener el valor absoluto de un flotante. P.ej. 'NSTimeInterval timeInterval = fabs ([start timeIntervalSinceNow]);' –

5

utilizar la función timeIntervalSince1970 de la clase NSDate, como a continuación:

double start = [startDate timeIntervalSince1970]; 
double end = [endDate timeIntervalSince1970]; 
double difference = end - start; 

Básicamente, esto es lo que yo uso para comparar la diferencia en segundos entre 2 fechas diferentes. También comprobar este enlace here

23

utilizar el método de timeIntervalSinceDate

NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate]; 

NSTimeInterval es sólo un double, definir en NSDate así:

typedef double NSTimeInterval; 
14

para nadie viene aquí buscando una aplicación GetTickCount() para iOS, aquí es el mío después de juntar varias fuentes:

#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; 
} 
+0

¿Alguien sabe por qué hay un molde redundante (vacío) en la llamada mach_timebase_info? –

+0

@SimonTillson es una buena pregunta, ya sea que se requirió silenciar una advertencia, o la copié desde otro lugar y simplemente no me di cuenta de que debía eliminarla. No puedo recordar –

200

No debe confiar en [NSDate date] por motivos de tiempo, ya que puede informar en exceso o por debajo del tiempo transcurrido. ¡Incluso hay casos en los que aparentemente su computadora viajará en el tiempo ya que el tiempo transcurrido será negativo! (Por ejemplo, si el reloj se movió hacia atrás, durante la temporización.)

De acuerdo con Aria Haghighi en la conferencia "avanzada iOS Reconocimiento de gestos" de la Winter 2013 Stanford iOS course (34:00), se debe utilizar CACurrentMediaTime() si necesita un intervalo de tiempo preciso.

Objective-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 

La razón es que [NSDate date] se sincroniza en el servidor, por lo que podría conducir a "hipo tiempo de sincronización" que puede conducir a errores muy difíciles de rastrear. CACurrentMediaTime(), por otro lado, es una hora del dispositivo que no cambia con estas sincronizaciones de red.

Necesitará add el QuartzCore framework a la configuración de su destino.

+14

Por favor, vote esto. Aunque creo que todos pueden estar de acuerdo en que NSDate debería ser su primera opción, esta sugerencia resolvió un problema mío. Cuando llamé a '[NSDate date]' dentro de un bloque de finalización dentro de un bloque de despacho, estaba obteniendo la misma hora "actual" que informaba '[NSDate date]' inmediatamente antes de que la ejecución alcanzara el punto en el que se crearon mis bloques. 'CACurrentMediaTime()' resolvió este problema. – n00neimp0rtant

+0

¿Cómo utilizaríamos el tiempo transcurrido para mostrar como mm: ss? – CyberMew

+0

¿Por qué nunca oí hablar de esto? – Morkrom

1

Otras respuestas son correctas (con una advertencia *).Añado esta respuesta simplemente para mostrar un ejemplo de uso:

- (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. 

}

En el depurador de consola, que se ve algo como esto:

DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds. 

* Advertencia: Como otros mencionado , use NSDate para calcular el tiempo transcurrido solo para fines ocasionales. Uno de estos propósitos podría ser la evaluación común, el perfil bruto, en el que solo se desea una idea aproximada de cuánto tiempo está tomando un método.

El riesgo es que la configuración de la hora actual del reloj del dispositivo podría cambiar en cualquier momento debido a la sincronización del reloj de la red. Por lo tanto, el tiempo NSDate podría avanzar o retroceder C en cualquier momento.

Cuestiones relacionadas