Получение системного тика с базовым C ++? - PullRequest
9 голосов
/ 29 апреля 2010

По сути, я хочу восстановить функцию окна getTickCount (), чтобы я мог использовать ее в базовом C ++ без каких-либо нестандартных библиотек или даже STL. (Таким образом, он соответствует библиотекам, поставляемым с Android NDK)

Я смотрел на

часы ()

LocalTime

время

Но я все еще не уверен, возможно ли повторить функцию окон getTickCount с библиотекой времени.

Может ли кто-нибудь указать мне правильное направление относительно того, как это сделать или даже если это возможно?

Обзор того, что я хочу сделать:

Я хочу, чтобы можно было рассчитать, как долго приложение «выполняет» определенную функцию.

Так, например, я хочу иметь возможность рассчитать, как долго приложение пытается зарегистрироваться на сервере

Я пытаюсь перенести его из Windows для запуска на Android на базе Linux, вот код Windows:


int TimeoutTimer::GetSpentTime() const
{
if (m_On)
{
    if (m_Freq>1)
    {
        unsigned int now;
        QueryPerformanceCounter((int*)&now);
        return (int)((1000*(now-m_Start))/m_Freq);
    }
    else
    {
        return (GetTickCount()-(int)m_Start);
    }
}
return -1;
}

Ответы [ 5 ]

19 голосов
/ 01 мая 2010

В Android NDK вы можете использовать вызов POSIX clock_gettime (), который является частью libc. Эта функция используется для завершения различных вызовов таймера Android.

Например, java.lang.System.nanoTime () реализован с помощью:

struct timespec now;
clock_gettime(CLOCK_MONOTONIC, &now);
return (u8)now.tv_sec*1000000000LL + now.tv_nsec;

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

Справочная страница Linux для clock_gettime () описывает другие часы, которые могут быть доступны, например, время процессора для каждого потока.

9 голосов
/ 29 апреля 2010

clock() работает очень похоже на GetTickCount() в Windows. Единицы могут быть разными. GetTickCount() возвращает миллисекунды. clock() возвращает CLOCKS_PER_SEC тиков в секунду. Оба имеют максимум, который будет опрокидываться (для Windows это около 49,7 дней).

GetTickCount() начинается с нуля при запуске ОС. Из документов похоже, что clock() запускается, когда происходит процесс. Таким образом, вы можете сравнить время между процессами с GetTickCount(), но вы, вероятно, не можете сделать это с clock().

Если вы пытаетесь вычислить, как долго что-то происходило, в рамках одного процесса, и вы не беспокоитесь об опрокидывании:

const clock_t start = clock();
// do stuff here
clock_t now = clock();
clock_t delta = now - start;
double seconds_elapsed = static_cast<double>(delta) / CLOCKS_PER_SEC;

Пояснение: Кажется, существует неопределенность в отношении того, возвращает ли clock() истекшее время стены или время процессора. Первые несколько ссылок, которые я проверил, говорят, что настенное время. Например:

Возвращает количество тактов, прошедших с момента запуска программы.

что, правда, немного расплывчато. MSDN более явный:

Прошедшее время настенных часов с начала процесса ....

Пользователь darron убедил меня копать глубже, поэтому я нашел черновую копию стандарта C (ISO / IEC 9899: TC2) и там написано:

... возвращает наилучшее приближение реализации к используемому времени процессора ...

Я полагаю, что каждая реализация, которую я когда-либо использовал, дает время настенных часов (что, я полагаю, является приблизительным значением используемого времени процессора).

Вывод: Если вы пытаетесь рассчитать время так, чтобы вы могли тестировать различные оптимизации, тогда мой ответ уместен. Если вы пытаетесь реализовать тайм-аут на основе фактического времени настенных часов, то вам нужно проверить локальную реализацию clock() или использовать другую задокументированную функцию, чтобы указать истекшее время настенных часов.

Обновление: В C ++ 11 есть также часть стандартной библиотеки, которая предоставляет различные часы и типы для захвата времени и продолжительности. Хотя стандарт и широкодоступен, пока не ясно, полностью ли поддерживает Android NDK.

3 голосов
/ 29 апреля 2010

Это зависит от платформы, поэтому вам просто нужно написать оболочку и реализовать специфику для каждой платформы.

1 голос
/ 29 апреля 2010

У вас есть доступ к функции прерывания vblank (или hblank) на Android? Если это так, увеличьте глобальную переменную переменную там для таймера.

1 голос
/ 29 апреля 2010

Это невозможно. Стандарт C ++ и, как следствие, стандартная библиотека ничего не знают о процессорах или «тиках». Это может измениться или не измениться в C ++ 0x с поддержкой потоков, но, по крайней мере, пока это невозможно.

...