Mesure du temps d'exécution d'une fonction en R

282

Existe-t-il un moyen normalisé dans R de mesurer le temps d'exécution d'une fonction?

Évidemment, je peux prendre system.timeavant et après l'exécution et ensuite prendre la différence de ceux-ci, mais je voudrais savoir s'il existe une méthode ou une fonction standardisée (je ne voudrais pas inventer la roue).


Je pense me souvenir d'avoir déjà utilisé quelque chose comme ci-dessous:

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
la source
2
Je pense que vous aviez proc.timeà l'esprit la cause system.timedont vous avez besoin.
Marek
1
Pour les fonctions plus grandes, Rprofc'est bien. Il fournit un profil de tous les processus dans un bloc / fonction de code.
Rich Scriven
38
Les nouveaux utilisateurs de R trouvant cette question via Google: require(microbenchmark)est maintenant (depuis quelques années) le moyen standard de la communauté pour chronométrer les choses. times <- microbenchmark( lm(y~x), glm(y~x), times=1e3); example(microbenchmark). Cela fait un statistique comparaison lmvs glmplus de 1000 essais, plutôt que de system.timetester une seule fois.
isomorphismes
utilisez res <- microbenchmark(your code1,your code2)et puis print(res)pour voir un tableau ou ggplot2::autoplot(res)pour voir un boxplot! ref
Travis

Réponses:

253

Une autre façon possible de le faire serait d'utiliser Sys.time ():

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

Pas la façon la plus élégante de le faire, par rapport à la réponse ci-dessus, mais certainement une façon de le faire.

Shreyes
la source
14
C'est beaucoup plus efficace en mémoire, alors system.time (), qui copie efficacement ses arguments. C'est important lorsque vous traitez des données qui rentrent à peine dans votre RAM.
Adam Ryczkowski
2
Pour les personnes qui utilisent Sys.time, veuillez lire ceci pour une mise en garde: Timing R code avec Sys.time ()
李哲源
1
system.time()était plus rapide pour moi. Je pense que cette réponse system.time()devrait être acceptée!
Gwang-Jin Kim
C'est ma façon préférée de connaître le temps qu'il faut pour un long calcul effectué en parallèle sur plusieurs cœurs. Dans ce cas, le temps d'horloge murale mesuré par le biais de cet appel est suffisamment précis car l'ordinateur sera beaucoup plus occupé avec tous les cœurs à calculer qu'à faire quoi que ce soit d'autre et les calculs prennent des minutes ou des heures à terminer. Il s'agit d'un cas d'utilisation très spécifique mais qui mérite d'être mentionné.
Pablo Adames
186

La fonction intégrée le system.time()fera.

Utilisez comme: system.time(result <- myfunction(with, arguments))

Andrie
la source
1
Il est important de savoir qu'il system.time()a un argument gcFirstqui est TRUEpar défaut. Cela, d'une part, rend la mesure un peu plus reproductible, mais peut générer un surcoût significatif du temps d'exécution total (qui n'est pas mesuré, bien sûr).
jakob-r
2
dans quelle unité est-ce mesuré? par exemple, je viens de courir system.time(result <- myfunction(with, arguments))et j'ai obtenu 187,564 en sortie - est-ce en quelques secondes ou quoi?
zsad512
Pour les personnes qui utilisent system.time, veuillez lire ceci pour une mise en garde: les erreurs «objet introuvable» et «symbole inattendu» lors du chronométrage du code R avec system.time () .
李哲源
@ zsad512 Je suis raisonnablement sûr que ce sont des secondes .
Tapper
58

Comme l'a dit Andrie, ça system.time()marche bien. Pour une fonction courte je préfère y mettre replicate():

system.time( replicate(10000, myfunction(with,arguments) ) )
Sacha Epskamp
la source
28
Il vaut mieux utiliser le package de microparamètres car il n'inclut pas la surcharge de réplication dans le timing.
hadley
37

Une façon un peu plus agréable de mesurer le temps d'exécution consiste à utiliser le package rbenchmark . Ce package vous permet (facilement) de spécifier le nombre de fois pour répliquer votre test et la référence relative devrait être.

Voir également une question connexe sur stats.stackexchange

csgillespie
la source
6
Microbenchmark est encore meilleur car il utilise des fonctions de synchronisation de plus haute précision.
hadley
4
@hadley Mais rbenchmark est plus convivial en cas de comparaison. Pour moi, microbenchmark est mis à niveau system.time. rmicrobenchmark est ce dont nous avons besoin :)
Marek
3
Le mainteneur de microbenchmark est assez réactif - je parie qu'il ajouterait tout ce dont vous avez besoin.
hadley
34

microbenchmark est un package léger (~ 50 Ko) et plus ou moins un moyen standard dans R pour comparer plusieurs expressions et fonctions:

microbenchmark(myfunction(with,arguments))

Par exemple:

> 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

Ici, les deux expressions ont été évaluées 10000 fois, avec un temps d'exécution moyen d'environ 25-30 ns.

Davor Josipovic
la source
32

Il y a aussi proc.time()

Vous pouvez utiliser de la même manière que Sys.timemais cela vous donne un résultat similaire à system.time.

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

la principale différence entre l'utilisation

system.time({ #your function here })

est que la proc.time()méthode exécute toujours votre fonction au lieu de simplement mesurer le temps ... et au fait, j'aime utiliser system.timeavec {}inside pour que vous puissiez mettre un ensemble de choses ...

Rodrigo de Alexandre
la source
25

Le package "tictoc" vous donne un moyen très simple de mesurer le temps d'exécution. La documentation est dans: https://cran.fhcrc.org/web/packages/tictoc/tictoc.pdf .

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

Pour enregistrer le temps écoulé dans une variable, vous pouvez faire:

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

Bien que d'autres solutions soient utiles pour une seule fonction, je recommande le morceau de code suivant où il est plus général et efficace:

Rprof(tf <- "log.log", memory.profiling = TRUE)
# the code you want to profile must be in between
Rprof (NULL) ; print(summaryRprof(tf))
TPArrow
la source
2
Je ne connaissais pas Rprof jusqu'à présent et c'est vraiment génial! De plus, il est livré avec la base R, donc pas besoin de paquet supplémentaire comme microbenchmarkou profvis.
Simon
Je me demande si rprof peut également être visualisé, comme par exemple si nous voulons tracer le temps pour chaque élément profilé?
Zawir Amin
@ZawirAmin Il y a un moyen, il suffit d'utiliser Rstudio >> menu de profil
TPArrow
13

Un autre moyen simple mais très puissant de le faire est d'utiliser le package profvis. Il ne mesure pas seulement le temps d'exécution de votre code, mais vous donne un aperçu de chaque fonction que vous exécutez. Il peut également être utilisé pour Shiny.

library(profvis)

profvis({
  #your code here
})

Cliquez ici pour quelques exemples.

gianni
la source
11

Vous pouvez utiliser de style Matlab tic- tocfonctions, si vous préférez. Voir cette autre question SO

Fonction chronomètre en R

Richie Cotton
la source
Était sur le point d'ajouter proc.time()… J'aime mieux le joli nom. =)
isomorphismes