J'ai deux scripts qui calculent chacun la factorielle d'un nombre. Je voudrais savoir lequel est le plus rapide. La time
commande me donne des millisecondes et le résultat est différent de temps en temps:
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.089s
user 0m0.052s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.091s
user 0m0.048s
sys 0m0.036s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.088s
user 0m0.048s
sys 0m0.040s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.088s
user 0m0.048s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.087s
user 0m0.064s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000
real 0m0.089s
user 0m0.068s
sys 0m0.016s
piousbox@piousbox-laptop:~/projects/trash$
Comment puis-je prendre le temps moyen nécessaire pour exécuter le script? Je pourrais analyser et faire la moyenne de la sortie d'un 100 time
, mais j'imagine qu'il existe une meilleure solution?
Réponses:
Non, votre idée de la moyenne est correcte.
L'exécution du script dépend de nombreux facteurs, mais elle doit cependant être répartie entre le temps de configuration (chargement de l'interpréteur en mémoire, configuration et éventuellement compilation de code en bytecode ou code machine) et le vrai temps d'exécution.
Pour mieux vous concentrer sur le temps d'exécution interne, vous effectuez la boucle dans le script lui-même (c'est-à-dire qu'au lieu de calculer une factorielle, vous la calculez 100 fois au cours d'une même exécution du script. Le script sera configuré une fois et la routine interne exécutera 100 fois).
Pour vous concentrer sur le temps total, vous exécutez le script cent fois et faites la moyenne des résultats. Idéalement, vous devez séparer ces exécutions suffisamment pour que le système retourne à chaque fois dans un "état de référence" (ou un état sans rapport avec le script). Par exemple, l'interpréteur lui - même sera mis en cache en mémoire, de sorte que la toute première exécution du script sera sensiblement plus lente que les suivantes.
Pour avoir une meilleure idée de l'algorithme, je pense que la meilleure façon est quelque chose comme ça (sur une machine autrement inactive):
L'application ne s'exécute qu'une seule fois, toute la configuration et l'amorçage sont effectués par la première itération non chronométrée, donc cela devrait minimiser les frais généraux (sauf peut-être pour l'appel de temps).
Si la fonction reçoit une entrée, vous feriez bien de lui fournir une séquence aléatoire d'entrées à l'aide d'un PRNG prédéfini avec une valeur fixe, pour garantir que les deux versions de la fonction testée reçoivent les mêmes valeurs. On évite ainsi une fonction d' effectuer apparemment mieux en raison de « nombres chanceux » (par exemple , je me souviens d' une variation de l'algorithme Hillsort qui a effectué mieux si le mesurablement nombre d'éléments à trier était sous la forme 2 k -1 avec petit k s).
la source
Vous pouvez exécuter des itérations du programme en boucle; et divisez le temps total par le nombre d'itérations:
la source
{1..10}
auparavant et je suis déconcerté que cela fonctionne, je ne le trouve pas dans le manuel bash. La seule chose triste est que vous ne connaissez pas la répartition de vos résultats (temps minimum et maximum).man -P 'less +/Brace\ Expansion' bash
bash
. Essayez de courir/bin/bash
avant cela.il existe un outil appelé multitime qui fait exactement cela: exécuter une commande plusieurs fois, mesurer le temps qu'il faut (réel / utilisateur / système avec moyenne, min / max et temps médian calculés automatiquement)
Par exemple, pour mesurer 100 fois un script similaire:
la source
Ceci est ancien mais il est apparu si haut sur Google lorsque je cherchais une commande que j'utilisais auparavant mais que je n'ai pas pu trouver. Quoi qu'il en soit, ma façon préférée de le faire est:
Cela donne pas mal de détails, y compris le temps d'exécution moyen juste à la fin:
la source
Pour
-n
,-r
et d'autres options, voir https://docs.python.org/2/library/timeit.html#command-line-interfacela source
Hyperfine est une autre option.
Exemple d'utilisation:
la source