time - TCL: ¿cómo saber cuánto tiempo ha funcionado una función?
timestamp proc-object (4)
Digamos que tengo un proceso y el proceso consiste en varias declaraciones y llamadas a funciones. ¿Cómo puedo saber cuánto tiempo ha llevado la función hasta ahora?
En caso de que realmente esté buscando algún tipo de generador de perfiles, eche un vistazo al paquete profiler en Tcllib: http://tcllib.sourceforge.net/doc/profiler.html
Para medir el tiempo que ha tomado un código, puede utilizar el time
o el clock
.
El comando de time
ejecutará su argumento de secuencia de comandos y devolverá una descripción de cuánto tiempo tomó el script, en milisegundos (más un texto descriptivo, que es trivial cortar con lindex
). Si realmente está haciendo un trabajo de análisis de rendimiento, puede proporcionar un argumento de conteo opcional que haga que el script se ejecute de manera repetida, pero para el monitoreo general, puede ignorarlo.
El comando de clock
permite obtener varios tipos de marcas de tiempo (además de realizar formateos, análisis y aritmética con los tiempos). El más grueso se obtiene con clock seconds
, que devuelve la cantidad de tiempo desde el comienzo de la época de Unix (en segundos calculados con tiempo civil; eso es lo que quieres a menos que estés haciendo algo especializado). Si necesita más detalles, debe usar clock milliseconds
clock microseconds
o clock microseconds
. También hay clock clicks
, pero normalmente no se define qué unidad está contando (a menos que pase la opción de -milliseconds
o -microseconds
). Depende de usted convertir las marcas de tiempo en algo útil para usted.
Si sincronizas elementos en Tcl 8.4 (¡o antes!), Entonces estás obligado a usar el time
, los clock seconds
clock clicks
o los clock clicks
(e incluso la opción -microseconds
está ausente, no hay un temporizador de resolución de microsegundos expuesto en 8.4). En ese caso, debería considerar actualizar a 8.5, ya que generalmente es más rápido. ¡Más rápido es bueno! (Si usa pre-8.4, definitivamente actualice ya que está muy atrás en el frente de soporte).
Para saber cuánto tiempo ha tardado una función, puede usar el comando de time
(envuelto alrededor de la llamada de función) o usar clock clicks
para obtener la hora actual antes y luego durante la función. La opción de time
es simple, pero solo puede cronometrar una función completa (y solo le dará un tiempo cuando la función regrese). El uso de clock clicks
se puede hacer varias veces, pero deberá restar la hora actual de la hora de inicio usted mismo.
un ejemplo muy crudo sería algo así como:
set TIME_start [clock clicks -milliseconds]
...do something...
set TIME_taken [expr [clock clicks -milliseconds] - $TIME_start]
Usando el proceso de tiempo, puede hacer lo siguiente:
% set tt [time {set x [expr 23 * 34]}]
38 microseconds per iteration