Je voudrais mesurer le temps qu'il faut pour répéter l'exécution d'une fonction. Est-ce
replicate()
que l'utilisation de boucles for est équivalente? Par exemple:system.time(replicate(1000, f())); system.time(for(i in 1:1000){f()});
Quelle est la méthode préférée?
En sortie de
system.time()
,sys+user
le temps CPU réel pour exécuter le programme est-il? Uneelapsed
bonne mesure de la performance temporelle du programme?
36
Réponses:
Pour une synchronisation efficace des programmes, surtout lorsque vous souhaitez comparer des solutions alternatives, vous avez besoin d’un contrôle! Un bon moyen est de mettre la procédure que vous chronométrez dans une fonction. Appelez la fonction dans une boucle de synchronisation. Ecrivez une procédure stub, essentiellement en supprimant tout le code de votre fonction et en en revenant (en laissant tous les arguments). Mettez le talon dans votre boucle de synchronisation et re-temps. Ceci mesure tous les frais généraux associés au timing. Soustrayez le temps intermédiaire du temps de procédure pour obtenir le net: il doit s'agir d'une mesure précise du temps réel nécessaire.
Comme la plupart des systèmes peuvent de nos jours être interrompus de manière péremptoire, il est important de procéder à plusieurs exécutions pour vérifier la variabilité. Au lieu de faire une longue série de secondes, effectuez courses d'environ secondes chacune. Cela aide de faire cela dans une double boucle tout en un. Non seulement cela est plus facile à gérer, mais cela introduit un peu de corrélation négative dans chaque série temporelle, ce qui améliore les estimations.N m N/ m
En utilisant ces principes de base de la conception expérimentale, vous contrôlez essentiellement toute différence liée à la manière dont vous déployez le code (par exemple, la différence entre une boucle for et une réplication ()). Cela fait disparaître votre problème.
la source
En ce qui concerne vos deux points:
replicate()
c'est fonctionnel.elapsed
le troisième chiffre.Ce que je fais souvent c'est
pour obtenir une moyenne ajustée de 90% de N répétitions d'appels
f()
.(Edité, avec un merci à Hadley d'avoir attrapé un thinko.)
la source
mean(replicate(N, system.time(f(...))[3]), trim = 0.05)
?Vous pouvez également chronométrer avec les pas de temps renvoyés par
Sys.time
; ceci mesure bien sûr le temps passé sur le mur, donc le temps de calcul en temps réel. Exemple de code:la source
En ce qui concerne la métrique de synchronisation à utiliser, je ne peux rien ajouter aux autres intervenants.
En ce qui concerne la fonction à utiliser, j'aime bien utiliser le? Benchmark du paquetage rbenchmark .
la source
Ils font des choses différentes. Chronométrez ce que vous souhaitez faire. replicate () renvoie un vecteur de résultats de chaque exécution de la fonction. La boucle for ne fonctionne pas. Par conséquent, ce ne sont pas des déclarations équivalentes.
De plus, déterminez le nombre de façons dont vous voulez que quelque chose soit fait. Ensuite, vous pouvez trouver la méthode la plus efficace.
la source