¿Existe una forma estandarizada en R de medir el tiempo de ejecución de la función?
Obviamente, puedo tomar system.time
antes y después de la ejecución y luego tomar la diferencia de esos, pero me gustaría saber si hay alguna forma o función estandarizada (me gustaría no inventar la rueda).
Me parece recordar que una vez he usado algo como a continuación:
somesysfunction("myfunction(with,arguments)")
> Start time : 2001-01-01 00:00:00 # output of somesysfunction
> "Result" "of" "myfunction" # output of myfunction
> End time : 2001-01-01 00:00:10 # output of somesysfunction
> Total Execution time : 10 seconds # output of somesysfunction
proc.time
en mente porquesystem.time
es uno que necesitas.Rprof
es agradable. Proporciona un perfil de todos los procesos en un fragmento de código / función.require(microbenchmark)
ahora es (desde hace un par de años) la forma estándar de la comunidad de cronometrar las cosas.times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark)
. Esto hace una estadística comparación delm
frente aglm
más de 1000 intentos, en lugar desystem.time
probar una sola vez.res <- microbenchmark(your code1,your code2)
y luegoprint(res)
para ver una tabla oggplot2::autoplot(res)
para ver un diagrama de caja. refRespuestas:
Otra forma posible de hacer esto sería usar Sys.time ():
No es la forma más elegante de hacerlo, en comparación con las respuestas anteriores, pero definitivamente es una forma de hacerlo.
fuente
Sys.time
, lea esto para algunas advertencias: Timing R code with Sys.time ()system.time()
Fue más rápido para mí. Creo que esa respuestasystem.time()
debe ser aceptada!La función incorporada
system.time()
lo hará.Usar como:
system.time(result <- myfunction(with, arguments))
fuente
system.time()
tiene un argumentogcFirst
que esTRUE
por defecto. Esto, por un lado, hace que la medición sea un poco más reproducible, pero puede generar una sobrecarga significativa del tiempo de ejecución total (que no se mide, por supuesto).system.time(result <- myfunction(with, arguments))
y obtuve 187.564 como salida, ¿eso es en segundos o qué?system.time
, lea esto para algunas advertencias: errores de "objeto no encontrado" y "símbolo inesperado" al sincronizar el código R con system.time () .Como dijo Andrie,
system.time()
funciona bien. Para una función corta, prefiero ponerlareplicate()
:fuente
Una forma un poco mejor de medir el tiempo de ejecución es utilizar el paquete rbenchmark . Este paquete (fácilmente) le permite especificar cuántas veces replicar su prueba y cuál debería ser el punto de referencia relativo.
Vea también una pregunta relacionada en stats.stackexchange
fuente
microbenchmark
es un paquete liviano (~ 50kB) y más o menos una forma estándar en R para comparar múltiples expresiones y funciones:Por ejemplo:
Aquí ambas expresiones se evaluaron 10000 veces, con un tiempo de ejecución medio de alrededor de 25-30 ns.
fuente
También hay
proc.time()
Puede usarlo de la misma manera
Sys.time
pero le da un resultado similar asystem.time
.la principal diferencia entre usar
es que el
proc.time()
método todavía no ejecutar su función en lugar de simplemente midiendo el tiempo ... y por cierto, me gusta usarsystem.time
con{}
el interior de lo que puede poner un conjunto de cosas ...fuente
El paquete "tictoc" le brinda una forma muy simple de medir el tiempo de ejecución. La documentación está en: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .
Para guardar el tiempo transcurrido en una variable que puede hacer:
fuente
Aunque otras soluciones son útiles para una sola función, recomiendo el siguiente código donde es más general y efectivo:
fuente
microbenchmark
oprofvis
.Otra forma simple pero muy poderosa de hacer esto es mediante el uso del paquete
profvis
. No solo mide el tiempo de ejecución de su código, sino que le proporciona un desglose de cada función que ejecuta. También se puede usar para Shiny.Haga clic aquí para ver algunos ejemplos.
fuente
Se puede utilizar MATLAB-estilo
tic
-toc
funciones, si lo prefiere. Ver esta otra pregunta SOFunción de cronómetro en R
fuente
proc.time()
... Me gusta más el lindo nombre. =)