2010-04-29 3 views
9

Básicamente quiero reconstruir la función de ventanas getTickCount() para que pueda usarla en C++ básico sin bibliotecas no estándar o incluso el STL. (Por lo tanto, cumple con las bibliotecas suministradas con el NDK de Android)Obteniendo el sistema tick count con basic C++?

que he mirado

reloj()

hora local

tiempo

Pero estoy aún no está seguro de si es posible replicar la función de ventanas getTickCount con la biblioteca de tiempo.

¿Alguien puede indicarme la dirección correcta de cómo hacer esto o incluso si es posible?

Una visión general de lo que quiero hacer:

Quiero ser capaz de calcular la duración de una aplicación se ha "haciendo" una determinada función.

Así, por ejemplo, quiero ser capaz de calcular el tiempo que la aplicación ha estado tratando de registrarse con un servidor

Estoy tratando de portarlo de las ventanas para ejecutar en el Linux basado en Android, aquí es las ventanas código:


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

¿Qué estás tratando de lograr? Puede haber formas de hacerlo. Tal vez dar un paso atrás y explicar el problema general. – Tim

+0

Buena idea, quiero ser capaz de calcular cuánto tiempo una aplicación ha estado "haciendo" una determinada función. Entonces, por ejemplo, quiero poder calcular cuánto tiempo la aplicación ha intentado registrar con un servidor –

+0

En ese caso, probablemente sea bastante trivial encontrar/crear un objeto que pueda calcular el tiempo transcurrido. ¿Estás buscando la secuencia/hora programada, o el tiempo total de reloj/pared? – Tim

Respuesta

18

En Android NDK puede usar la llamada POSIX clock_gettime(), que es parte de libc. Esta función es donde terminan varias llamadas de temporizador Android.

Por ejemplo, java.lang.System.nanoTime() se implementa con:

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

En este ejemplo se utiliza el reloj monótona, que es lo que quiere cuando se calculan las duraciones. A diferencia del reloj de pared (disponible a través de gettimeofday()), no salta hacia adelante o hacia atrás cuando el proveedor de la red cambia el reloj del dispositivo.

La página de manual de Linux para clock_gettime() describe los otros relojes que pueden estar disponibles, como el tiempo de CPU transcurrido por hilo.

1

no es posible. El estándar C++ y, como consecuencia, la biblioteca estándar, no saben nada sobre procesadores o 'ticks'. Esto puede cambiar o no en C++ 0x con el soporte de subprocesamiento, pero al menos por ahora, no es posible.

1

¿Tiene acceso a la función de interrupción de vblank (o hblank) en Android? Si es así, incremente una var global y volátil para un temporizador.

3

Esto depende de la plataforma, por lo que solo tiene que escribir un contenedor e implementar los detalles para cada plataforma.

+0

En Android solo se proporcionan las bibliotecas C básicas, lo que se ve debajo de la biblioteca c aquí - http://www.cplusplus.com/reference/clibrary/, no tiene plataforma adicional specfic extras –

+1

La biblioteca C tiene el time.h no está disponible?Puede que no le dé una gran resolución de tiempo, pero debería ser suficiente para sus necesidades. use clock() con CLOCKS_PER_SEC para obtener el tiempo transcurrido. – daramarak

+0

@daramarak clock() devuelve el tiempo de proceso, no la hora del sistema. – darron

9

clock() funciona de manera muy similar a Windows GetTickCount(). Las unidades pueden ser diferentes. GetTickCount() devuelve milisegundos. clock() devuelve CLOCKS_PER_SEC tics por segundo. Ambos tienen un máximo que se transferirá (para Windows, eso es alrededor de 49.7 días).

GetTickCount() comienza en cero cuando se inicia el sistema operativo. Desde los documentos, parece que clock() se inicia cuando lo hace el proceso. Por lo tanto, puede comparar tiempos entre procesos con GetTickCount(), pero probablemente no pueda hacerlo con clock().

Si usted está tratando de calcular cuánto tiempo ha estado sucediendo algo, dentro de un solo proceso, y no estás preocupado por vuelco:

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; 

Aclaración: Parece que hay incertidumbre en si clock() devuelve el tiempo de pared transcurrido o el tiempo de procesador. Las primeras referencias que revisé dicen tiempo de pared.Por ejemplo:

Returns the number of clock ticks elapsed since the program was launched.

que ciertamente es un poco vago. MSDN es más explícito:

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

darron Usuario me convenció para cavar más profundo, por lo que se encontró una copia del borrador de la norma C (ISO/IEC 9899: TC2), y que dice:

... vuelve mejor aproximación de la aplicación a la hora procesador utilizado ...

Creo que cada implementación que he usado da el tiempo del reloj de pared (que supongo que es una aproximación al tiempo de procesador utilizado).

Conclusión: Si está tratando de programar el tiempo para que pueda comparar varias optimizaciones, entonces mi respuesta es apropiada. Si intenta implementar un tiempo de espera basado en el tiempo real del reloj de pared, entonces debe verificar su implementación local de clock() o utilizar otra función que esté documentada para dar el tiempo transcurrido del reloj de pared.

Actualización: Con C++ 11, también está la parte de la biblioteca estándar, que proporciona una variedad de relojes y tipos para capturar tiempos y duraciones. Si bien está estandarizado y ampliamente disponible, no está claro si el Android NDK es totalmente compatible.

+0

Esto no es verdad. clock() devuelve el tiempo utilizado por el proceso, que suele ser mucho más pequeño que el tiempo total del sistema. – darron

+0

@darron: No dije clock() devuelve la hora del sistema. De hecho, señalé esa diferencia en el segundo párrafo. La pregunta requería una forma de cronometrar cuánto tarda algo utilizando bibliotecas estándar de C++. Mi respuesta explica cómo hacer eso. –

+0

Bueno, el primer y último párrafo parecen ignorar la existencia del segundo. El código de ejemplo le dará tiempo de SPENT en el proceso en sí, no en el reloj de pared desde 'inicio'. Por lo tanto, si tiene un proceso muy liviano que se ejecuta durante días, su reloj podría tener solo 5 segundos. No es similar a GetTickCount() en absoluto, además de ser poco sincronizado en algo. Sé que esta es una vieja pregunta/respuesta, pero la gente todavía encuentra estas cosas y trata de usar la información provista. – darron