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

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.


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))


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) ) )

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


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.


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 ...


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

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))

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.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.