Quiero saber cuánto tiempo tarda una determinada función en ejecutar mi programa C ++ en Linux . Después, quiero hacer una comparación de velocidad. Vi varias funciones de tiempo pero terminé con esto desde boost. Crono:
process_user_cpu_clock, captures user-CPU time spent by the current process
Ahora, no estoy claro si uso la función anterior, ¿tendré el único tiempo que la CPU pasó en esa función?
En segundo lugar, no pude encontrar ningún ejemplo de uso de la función anterior. ¿Alguien puede ayudarme a usar la función anterior?
PD: En este momento, estoy usando std::chrono::system_clock::now()
para obtener el tiempo en segundos, pero esto me da resultados diferentes debido a la carga de CPU diferente cada vez.
c++
optimization
profiling
Xara
fuente
fuente
clock_gettime
.. gcc define otros relojes como:typedef system_clock steady_clock; typedef system_clock high_resolution_clock;
en Windows, useQueryPerformanceCounter
.Respuestas:
Es un método muy fácil de usar en C ++ 11. Tienes que usar
std::chrono::high_resolution_clock
desde el<chrono>
encabezado.Úselo así:
Esto medirá la duración de la función.
NOTA: No siempre obtendrá el mismo tiempo para una función. Esto se debe a que la CPU de su máquina puede ser menos o más utilizada por otros procesos que se ejecutan en su computadora, así como su mente puede estar más o menos concentrada cuando resuelve un ejercicio matemático. En la mente humana, podemos recordar la solución de un problema matemático, pero para una computadora el mismo proceso siempre será algo nuevo; así, como dije, ¡no siempre obtendrás el mismo resultado!
fuente
high_resolution_clock
le dará el tiempo físico y real que su función tarda en ejecutarse. Entonces, en su primera ejecución, su CPU se estaba usando menos que en la siguiente. Por "usado" me refiero a qué otro trabajo de aplicación usa la CPU.steady_clock
? ¿No es posible quehigh_resolution_clock
pueda ser un reloj no monótono?Aquí hay una función que medirá el tiempo de ejecución de cualquier función pasada como argumento:
Ejemplo de uso:
Salida:
fuente
high_resolution_clock
puede ser un alias desystem_clock
(reloj de pared)steady_clock
o un tercer reloj independiente. Ver detalles aquí . Para el reloj de la CPU,std::clock
se puede usarwindows.h
en un proyecto de C ++ no trivial. Enassert
primer lugar, "quod licet iovi non licet bovi";). En segundo lugar, no todas las decisiones en la biblioteca estándar (que a veces datan de décadas) se consideran una buena idea según los estándares modernos. Hay una razón por la cual el diseñador de módulos de C ++ se esfuerza mucho por no exportar macros por defecto.programa simple para encontrar el tiempo de ejecución de una función.
fuente
En el libro de Scott Meyers encontré un ejemplo de expresión lambda genérica universal que se puede usar para medir el tiempo de ejecución de funciones. (C ++ 14)
El problema es que solo mide una ejecución, por lo que los resultados pueden ser muy diferentes. Para obtener un resultado confiable, debe medir un gran número de ejecuciones. Según la conferencia de Andrei Alexandrescu en la conferencia code :: dive 2015 - Writing Fast Code I:
Tiempo medido: tm = t + tq + tn + to
dónde:
tm - tiempo medido (observado)
t - el tiempo real de interés
tq: tiempo agregado por el ruido de cuantización
tn - tiempo agregado por varias fuentes de ruido
a - tiempo de sobrecarga (medición, bucle, funciones de llamada)
De acuerdo con lo que dijo más adelante en la conferencia, debe tomar un mínimo de esta gran cantidad de ejecución como resultado. Os animo a mirar la conferencia en la que explica por qué.
También hay una muy buena biblioteca de google: https://github.com/google/benchmark . Esta biblioteca es muy simple de usar y poderosa. Puede consultar algunas conferencias de Chandler Carruth en YouTube donde está usando esta biblioteca en la práctica. Por ejemplo, CppCon 2017: Chandler Carruth "Going Nowhere Faster";
Ejemplo de uso:
EDITAR: Por supuesto, siempre debe recordar que su compilador puede optimizar algo o no. Herramientas como perf pueden ser útiles en tales casos.
fuente
Manera fácil para C ++ o C anteriores:
La precisión del tiempo en segundos es
1.0/CLOCKS_PER_SEC
fuente
Por ejemplo, para encontrar todos los números primos entre 1 y 100 millones, se tarda aproximadamente 1 minuto y 40 segundos. Entonces el tiempo de ejecución se imprime como:
El código está aquí:
fuente
Aquí hay una excelente plantilla de clase de solo encabezado para medir el tiempo transcurrido de una función o cualquier bloque de código:
Aquí hay algunos usos:
Como la clase es una plantilla, podemos especificar fácilmente cómo queremos medir y mostrar nuestro tiempo. Esta es una plantilla de clase de utilidad muy útil para hacer marcas de banco y es muy fácil de usar.
fuente
stop()
función miembro no es necesaria porque el destructor detiene el temporizador por usted.test code
comience el temporizador. Luego, después detest code
usar explícitamente el objeto del temporizador y llamar a su método de detención. Tienes que invocarlo manualmente cuando quieras alstop
temporizador. La clase no toma ningún parámetro. Además, si utilizó esta clase tal como lo he mostrado, verá que hay un mínimo de tiempo entre la llamadaobj.stop
y sudestructor
.<chrono>
?Recomiendo usar el
steady_clock
que es voluntario para ser monótono, a diferenciahigh_resolution_clock
.Salida:
fuente
Puede tener una clase simple que se puede utilizar para este tipo de mediciones.
Lo único que debe hacer es crear un objeto en su función al comienzo de esa función
y eso es. La clase se puede modificar para adaptarse a sus requisitos.
fuente
Como ninguna de las respuestas proporcionadas son muy precisas o dan resultados reproducibles, decidí agregar un enlace a mi código que tenga precisión y estadísticas científicas por debajo de los nanosegundos.
Tenga en cuenta que esto solo funcionará para medir el código que tarda (muy) poco tiempo en ejecutarse (es decir, unos pocos ciclos de reloj hasta unos pocos miles): si se ejecutan tanto tiempo que es probable que sean interrumpidos por alguna interrupción -heh- , entonces claramente no es posible dar un resultado reproducible y preciso; La consecuencia es que la medición nunca termina: es decir, continúa midiendo hasta que estadísticamente está 99.9% seguro de que tiene la respuesta correcta que nunca sucede en una máquina que tiene otros procesos en ejecución cuando el código tarda demasiado.
https://github.com/CarloWood/cwds/blob/master/benchmark.h#L40
fuente
Si desea ahorrar tiempo y líneas de código, puede hacer que la medición del tiempo de ejecución de la función sea una macro de una línea:
a) Implemente una clase de medición de tiempo como ya se sugirió anteriormente (aquí está mi implementación para Android):
b) Agregue una macro conveniente que use el nombre de la función actual como TAG (usar una macro aquí es importante, de lo contrario
__FUNCTION__
evaluará enMeasureExecutionTime
lugar de la función que desea medirc) Escriba su macro al comienzo de la función que desea medir. Ejemplo:
Lo que dará como resultado la siguiente salida:
Tenga en cuenta que esto (como todas las otras soluciones sugeridas) medirá el tiempo entre el momento en que se llamó a su función y cuando regresó, no necesariamente el momento en que su CPU estaba ejecutando la función. Sin embargo, si no le da al programador ningún cambio para suspender su código de ejecución llamando a sleep () o similar, no hay diferencia entre ellos.
fuente