2010-09-30 11 views
20

Me preguntaba si hay una manera fácil de obtener la hora actual en el código nativo de Android. De manera óptima, sería algo comparable a System.getTimeMillies(). Solo lo usaré para ver cuánto tardan ciertas llamadas de función, por lo que una variable larga con el tiempo actual en milisegundos sería la solución óptima para mí.¿Cómo obtener la hora actual en el código nativo de Android?

¡Gracias de antemano!

Respuesta

13

Para una resolución de microsegundos, puede utilizar gettimeofday(). Utiliza el "reloj de pared", que continúa avanzando cuando el dispositivo está dormido, pero está sujeto a cambios repentinos hacia adelante o hacia atrás si la red actualiza el reloj del dispositivo.

También puede usar clock_gettime (CLOCK_MONOTONIC). Utiliza el reloj monótono, que nunca salta hacia adelante o hacia atrás, pero deja de contar cuando el dispositivo duerme.

La resolución real de los temporizadores depende del dispositivo.

Ambas son API POSIX, no específicas de Android.

+0

CLOCK_BOOTTIME (desde la versión 2.6.39; específica de Linux) sería mejor? –

22

Para los perezosos, añadir esto a la parte superior de su código:

#include <time.h> 

// from android samples 
/* return current time in milliseconds */ 
static double now_ms(void) { 

    struct timespec res; 
    clock_gettime(CLOCK_REALTIME, &res); 
    return 1000.0 * res.tv_sec + (double) res.tv_nsec/1e6; 

} 

Llamada así:

double start = now_ms(); // start time 

// YOUR CODE HERE 

double end = now_ms(); // finish time 

double delta = end - start; // time your code took to exec in ms 
+1

la pereza prevalece una vez más \ o /, muchas gracias torger! – Sipty

+1

Tenga en cuenta que 'CLOCK_REALTIME' no es monotónico, use' CLOCK_MONOTONIC' si necesita tiempo no decreciente. – Simon

3

Otra para los perezosos, esta función devuelve la hora actual en nanosegundos utilizando CLOCK_MONOTONIC

#include <time.h> 
#define NANOS_IN_SECOND 1000000000 

static long currentTimeInNanos() { 

    struct timespec res; 
    clock_gettime(CLOCK_MONOTONIC, &res); 
    return (res.tv_sec * NANOS_IN_SECOND) + res.tv_nsec; 
} 
Cuestiones relacionadas