Función de medición del tiempo de ejecución en R

282

¿Existe una forma estandarizada en R de medir el tiempo de ejecución de la función?

Obviamente, puedo tomar system.timeantes 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
dns
fuente
2
Creo que lo tenías proc.timeen mente porque system.timees uno que necesitas.
Marek
1
Para funciones más grandes, Rprofes agradable. Proporciona un perfil de todos los procesos en un fragmento de código / función.
Rich Scriven el
38
Los nuevos usuarios de R que encuentran esta pregunta a través de google: 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 de lmfrente a glmmás de 1000 intentos, en lugar de system.timeprobar una sola vez.
isomorphismes
use res <- microbenchmark(your code1,your code2)y luego print(res)para ver una tabla o ggplot2::autoplot(res)para ver un diagrama de caja. ref
Travis

Respuestas:

253

Otra forma posible de hacer esto sería usar Sys.time ():

start.time <- Sys.time()
...Relevent codes...
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken

No es la forma más elegante de hacerlo, en comparación con las respuestas anteriores, pero definitivamente es una forma de hacerlo.

Shreyes
fuente
14
Esto es mucho más eficiente en la memoria, que system.time (), que copia efectivamente sus argumentos. Es importante cuando se trata de datos que apenas caben en su RAM.
Adam Ryczkowski
2
Para las personas que usan Sys.time, lea esto para algunas advertencias: Timing R code with Sys.time ()
李哲源
1
system.time()Fue más rápido para mí. Creo que esa respuesta system.time()debe ser aceptada!
Gwang-Jin Kim
Esta es mi forma preferida de saber el tiempo que lleva un cálculo largo realizado en paralelo en múltiples núcleos. En este caso, el tiempo del reloj de pared medido a través de esta llamada es lo suficientemente preciso ya que la computadora estará mucho más ocupada con todos los núcleos calculando que haciendo cualquier otra cosa y los cálculos demoran minutos u horas en completarse. Este es un caso de uso muy específico, pero vale la pena mencionar.
Pablo Adames
186

La función incorporada system.time()lo hará.

Usar como: system.time(result <- myfunction(with, arguments))

Andrie
fuente
1
Es importante saber que system.time()tiene un argumento gcFirstque es TRUEpor 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).
jakob-r
2
¿En qué unidad se mide esto? por ejemplo, acabo de correr system.time(result <- myfunction(with, arguments))y obtuve 187.564 como salida, ¿eso es en segundos o qué?
zsad512
Para las personas que usan 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 () .
李哲源
@ zsad512 Estoy razonablemente seguro de que son segundos .
Tapper
58

Como dijo Andrie, system.time()funciona bien. Para una función corta, prefiero ponerla replicate():

system.time( replicate(10000, myfunction(with,arguments) ) )
Sacha Epskamp
fuente
28
Es mejor usar el paquete de microbenchmark porque no incluye la sobrecarga de la réplica en el tiempo.
Hadley
37

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

csgillespie
fuente
66
Microbenchmark es aún mejor porque utiliza funciones de temporización de mayor precisión.
hadley
44
@hadley Pero rbenchmark es más fácil de usar en caso de comparaciones. Para mí, microbenchmark es system.time actualizado. rmicrobenchmark es lo que necesitamos :)
Marek
3
El mantenedor de microbenchmark es bastante receptivo: apuesto a que agregará lo que sea que necesite.
hadley
34

microbenchmark es un paquete liviano (~ 50kB) y más o menos una forma estándar en R para comparar múltiples expresiones y funciones:

microbenchmark(myfunction(with,arguments))

Por ejemplo:

> microbenchmark::microbenchmark(log10(5), log(5)/log(10), times = 10000)
Unit: nanoseconds
           expr min lq    mean median uq   max neval cld
       log10(5)   0  0 25.5738      0  1 10265 10000   a
 log(5)/log(10)   0  0 28.1838      0  1 10265 10000

Aquí ambas expresiones se evaluaron 10000 veces, con un tiempo de ejecución medio de alrededor de 25-30 ns.

Davor Josipovic
fuente
32

También hay proc.time()

Puede usarlo de la misma manera Sys.timepero le da un resultado similar a system.time.

ptm <- proc.time()
#your function here
proc.time() - ptm

la principal diferencia entre usar

system.time({ #your function here })

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 usar system.timecon {}el interior de lo que puede poner un conjunto de cosas ...

Rodrigo de Alexandre
fuente
25

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 .

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
toc()

Para guardar el tiempo transcurrido en una variable que puede hacer:

install.packages("tictoc")
require(tictoc)
tic()
rnorm(1000,0,1)
exectime <- toc()
exectime <- exectime$toc - exectime$tic
Anton
fuente
18

Aunque otras soluciones son útiles para una sola función, recomiendo el siguiente código donde es más general y efectivo:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))
TPArrow
fuente
2
No sabía sobre Rprof hasta ahora y ¡es realmente genial! Además, viene con la base R, por lo que no es necesario un paquete adicional como microbenchmarko profvis.
Simon C.
Me pregunto si también se puede visualizar rprof, como por ejemplo si queremos graficar el tiempo de cada elemento que perfila.
Zawir Amin
@ZawirAmin Hay una manera, solo usa Rstudio >> menú de perfil
TPArrow
13

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.

library(profvis)

profvis({
  #your code here
})

Haga clic aquí para ver algunos ejemplos.

gianni
fuente
11

Se puede utilizar MATLAB-estilo tic- tocfunciones, si lo prefiere. Ver esta otra pregunta SO

Función de cronómetro en R

Algodón Richie
fuente
Estaba a punto de agregar proc.time()... Me gusta más el lindo nombre. =)
isomorfismos el