Получение Системы отмечает количество с основным C++?

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

Я посмотрел на

часы ()

localtime

время

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

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

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

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

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

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


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;
}
9
задан fadden 4 August 2015 в 22:49
поделиться

5 ответов

В 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() описаны другие часы, которые могут быть доступны, например, время работы процессора для каждого потока.

19
ответ дан 4 December 2019 в 06:55
поделиться

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

3
ответ дан 4 December 2019 в 06:55
поделиться

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

1
ответ дан 4 December 2019 в 06:55
поделиться

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

1
ответ дан 4 December 2019 в 06:55
поделиться

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 сказано более четко:

The elapsed wall-clock time since the start of the process....

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

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

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

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

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

9
ответ дан 4 December 2019 в 06:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: