Как получить текущее время в собственном коде Android?

Мне было интересно, есть ли простой способ получить текущее время в собственном коде Android. Оптимально было бы что-то сравнимое с System.getTimeMillies(). Я буду использовать его только для того, чтобы посмотреть, сколько времени займут вызовы определенных функций, поэтому длинная переменная с текущим временем в миллисекундах будет для меня оптимальным решением.

Заранее спасибо!


person Pandoro    schedule 30.09.2010    source источник


Ответы (3)


Для микросекундного разрешения вы можете использовать gettimeofday(). При этом используется «время настенных часов», которое продолжает увеличиваться, когда устройство находится в спящем режиме, но подвержено внезапным сдвигам вперед или назад, если сеть обновляет часы устройства.

Вы также можете использовать clock_gettime(CLOCK_MONOTONIC). При этом используются монотонные часы, которые никогда не перескакивают вперед или назад, а перестают считать, когда устройство находится в спящем режиме.

Фактическое разрешение таймеров зависит от устройства.

Оба они являются API-интерфейсами POSIX, а не специфичными для Android.

person fadden    schedule 01.10.2010
comment
CLOCK_BOOTTIME (начиная с Linux 2.6.39; для Linux) будет лучше? - person Wilson Chen; 01.06.2015

Для ленивых добавьте это в начало кода:

#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;

}

Назовите это так:

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
person torger    schedule 14.01.2013
comment
Имейте в виду, что CLOCK_REALTIME не является монотонным, используйте CLOCK_MONOTONIC, если вам нужно неубывающее время. - person Simon; 13.03.2016

Еще одна для ленивых, эта функция возвращает текущее время в наносекундах, используя 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;
}
person donturner    schedule 21.03.2017
comment
Я не верю, что монотонные часы гарантированно начинаются с какого-либо конкретного значения, и неразумно зависеть от размера long. Если вы собираетесь умножать time_t на 1e9, вы должны использовать явный 64-битный тип (например, int64_t) для приведения tv_sec и в качестве возвращаемого значения. - person fadden; 15.07.2018