En Windows, clock()
devuelve el tiempo en milisegundos, pero en esta caja de Linux en la que estoy trabajando, lo redondea al 1000 más cercano, por lo que la precisión es solo al "segundo" nivel y no al nivel de milisegundos.
Encontré una solución con Qt usando la QTime
clase, instanciando un objeto y llamándolo y start()
luego llamando elapsed()
para obtener la cantidad de milisegundos transcurridos.
Tuve suerte porque estoy trabajando con Qt para empezar, pero me gustaría una solución que no dependa de bibliotecas de terceros,
¿No hay una forma estándar de hacer esto?
ACTUALIZAR
No recomiende Boost ..
Si Boost y Qt pueden hacerlo, seguramente no es magia, ¡debe haber algo estándar que estén usando!
Respuestas:
Puede usar gettimeofday al principio y al final de su método y luego diferenciar las dos estructuras de retorno. Obtendrá una estructura como la siguiente:
EDITAR: Como sugieren los dos comentarios a continuación, clock_gettime (CLOCK_MONOTONIC) es una opción mucho mejor si lo tiene disponible, que debería estar en casi todas partes en estos días.
EDITAR: Alguien más comentó que también puede usar C ++ moderno con std :: chrono :: high_resolution_clock, pero no se garantiza que sea monótono. En su lugar, utilice reloj_constante.
fuente
CLOCK_MONOTONIC
es excelente para evitar ajustes de hora localizados en el sistema.fuente
POSIX.1-2008 marks gettimeofday() as obsolete, recommending the use of clock_gettime(2) instead.
manual de gettimeofday (2): @CTT, ¿podría actualizar el ejemplo cambiandostruct timeval
astruct timespec
, ygettimeofday(&start, NULL)
aclock_gettime(CLOCK_MONOTONIC, &start)
para que la gente no tenga problemas?Tenga en cuenta que
clock
qué no medir el tiempo de reloj de pared. Eso significa que si su programa tarda 5 segundos,clock
no medirá necesariamente 5 segundos, pero podría más (su programa podría ejecutar varios subprocesos y, por lo tanto, podría consumir más CPU que el tiempo real) o menos. Mide una aproximación del tiempo de CPU utilizado. Para ver la diferencia, considere este código.Sale en mi sistema
¡Porque todo lo que hicimos fue dormir y no usar tiempo de CPU! Sin embargo, usando
gettimeofday
obtenemos lo que queremos (?)Salidas en mi sistema
Si necesita más precisión pero desea obtener el tiempo de la CPU , entonces puede considerar usar la
getrusage
función.fuente
sleep()
- ya pensé en hacer una pregunta (¿por qué funciona bien para todos excepto para mí?) , Cuando encontré su respuesta.También recomiendo las herramientas que ofrece Boost. O el mencionado Boost Timer, o hackear algo de Boost.DateTime o hay una nueva biblioteca propuesta en la caja de arena: Boost.Chrono : esta última será un reemplazo para el Timer y contará con:
duration
time_point
system_clock
monotonic_clock
high_resolution_clock
timer
, con typedefs:system_timer
monotonic_timer
high_resolution_timer
process_clock
, capturando tiempos reales, de CPU de usuario y de CPU del sistema.process_timer
, capturando tiempos reales transcurridos, CPU de usuario y CPU del sistema.run_timer
, informe conveniente de | process_timer | resultados.Aquí está la fuente de la lista de funciones
fuente
Escribí una
Timer
clase basada en la respuesta de CTT . Se puede utilizar de la siguiente manera:Aquí está su implementación:
fuente
Si no necesita que el código sea portátil a unices antiguos, puede usar clock_gettime (), que le dará el tiempo en nanosegundos (si su procesador admite esa resolución). Es POSIX, pero de 2001.
fuente
clock () tiene una resolución a menudo bastante pésima. Si desea medir el tiempo en el nivel de milisegundos, una alternativa es usar clock_gettime (), como se explica en esta pregunta.
(Recuerde que debe vincularse con -lrt en Linux).
fuente
Con C ++ 11 y
std::chrono::high_resolution_clock
puedes hacer esto:Salida:
Enlace a la demostración: http://cpp.sh/2zdtu
fuente
clock () no devuelve milisegundos o segundos en linux. Por lo general, clock () devuelve microsegundos en un sistema Linux. La forma correcta de interpretar el valor devuelto por clock () es dividirlo por CLOCKS_PER_SEC para averiguar cuánto tiempo ha pasado.
fuente
Esto debería funcionar ... probado en una mac ...
Sí ... ejecútelo dos veces y reste ...
fuente
En el estándar POSIX
clock
tiene su valor de retorno definido en términos del símbolo CLOCKS_PER_SEC y una implementación es libre de definir esto de cualquier manera conveniente. En Linux, he tenido buena suerte con latimes()
función.fuente
gettimeofday - el problema es que puede tener valores más bajos si cambia su reloj de hardware (con NTP por ejemplo) Boost - no disponible para este proyecto clock () - generalmente devuelve un entero de 4 bytes, lo que significa que es de baja capacidad, y después de algún tiempo devuelve números negativos.
Prefiero crear mi propia clase y actualizar cada 10 milisegundos, así es más flexible e incluso puedo mejorarla para tener suscriptores.
para actualizarlo uso setitimer:
Mira setitimer y ITIMER_VIRTUAL e ITIMER_REAL.
No utilice las funciones de alarma o ualarm, tendrá poca precisión cuando su proceso se convierta en un trabajo duro.
fuente
Prefiero la biblioteca Boost Timer por su simplicidad, pero si no desea usar bibliotecas de terceros, usar clock () parece razonable.
fuente
Como actualización, parece que en Windows clock () mide el tiempo del reloj de pared (con precisión CLOCKS_PER_SEC)
mientras que en Linux, mide el tiempo de la CPU en los núcleos utilizados por el proceso actual
y (parece, y como lo indica el póster original) en realidad con menos precisión que CLOCKS_PER_SEC, aunque tal vez esto dependa de la versión específica de Linux.
fuente
Me gusta el método Hola Soy de no usar gettimeofday (). Me pasó en un servidor en ejecución que el administrador cambió la zona horaria. El reloj se actualizó para mostrar el mismo valor local (correcto). Esto provocó que la función time () y gettimeofday () cambiaran 2 horas y todas las marcas de tiempo en algunos servicios se bloquearon.
fuente
Escribí una
C++
clase usandotimeb
.Funciones de los miembros:
Ejemplo de uso:
La salida en mi computadora es '19'. La precisión de la
msTimer
clase es del orden de milisegundos. En el ejemplo de uso anterior,for
se realiza un seguimiento del tiempo total de ejecución ocupado por el bucle. Esta vez incluyó el cambio del sistema operativo dentro y fuera del contexto de ejecuciónmain()
debido a la multitarea.fuente