Comment faire la moyenne des commandes de temps?

18

J'utilise timecertaines de mes commandes. Maintenant, pour faire la moyenne des mesures, je voudrais exécuter et chronométrer mes commandes un nombre spécifié de fois, et obtenir les résultats avec une moyenne calculée et un écart-type. Le résultat serait comme:

avgtime -n 100 my_command

real    0m5.388s stdev 0m0.068s
user    0m5.380s stdev 0m0.067s
sys     0m0.004s stdev 0m0.000s

Existe-t-il un outil UNIX pour cela? GNU / Linux en a-t-il un?

Didier Trosset
la source

Réponses:

7

Vous pouvez essayer d'utiliser le module timeit, disponible dans n'importe quel système avec Python:

$ python -m timeit "__import__('os').system('my command here')"
10 loops, best of 3: 591 msec per loop
bhdnx
la source
l'utilisation os.system(), entraîne la surcharge de l'appel / création d'un shell avec chaque commande. Probablement mieux utiliser subprocess.call ()
Anthon
vrai, mais serait probablement constant de toute façon
bhdnx
4

Ce n'est pas exactement un outil UNIX ou GNU / Linux, mais vous pouvez utiliser tout à fait confortablement l' environnement logiciel R pour le calcul statistique . (Je ne trouve cependant rien de plus spécifique pour votre tâche .)

Modifier Comment pourrais - je en doute, il est bien sûr un paquet de référence pour R: rbenchmark. Il enveloppe apparemment system.time()que vous pouvez également utiliser directement. Ou regardez ceci, une simple paire de fonctions chronomètre. Voir aussi "Exécution d'une commande système" @Rosetta Code (ou pas, c'est le cas system("command").)

Edit2 Je viens de voir cette question, "Mesurer le temps dans un script" dans la colonne "Associée" de droite, cela pourrait aussi être utilisé, c'est-à-dire prendre du temps, faire pour la boucle ( Ntemps), prendre du temps à nouveau, calculer la durée, diviser par N. (Encore plus facile, essayez time ( for-loop ), analysez sa sortie, divisez par N).

sr_
la source
3

Vous pouvez utiliser Rpour calculer rapidement la moyenne, l'écart-type et d'autres valeurs intéressantes.

Par exemple, vous pouvez utiliser l'heure GNU pour écrire plusieurs mesures d'exécution dans un fichier CSV:

function measure
{
  f=$1; shift
  n=$2; shift
  echo wall,user,sys,rss > "$f"
  for i in $(seq $n); do
    /usr/bin/time --output "$f" --append --format '%e,%U,%S,%M' "$@" >/dev/null
  done
}

Ensuite, vous pouvez générer les valeurs avec R comme ceci:

Rscript --vanilla -e "b=read.csv(file='$f');summary(b);sapply(b, sd);"

J'ai créé un petit script de référence qui fait également une jolie impression de la sortie R, par exemple:

$ benchmark.sh 100 ./some_prog arg1 arg2
n=100 | min    | Q1     | med    | mean   | Q3     | max    | std
wall  | 0.0400 | 0.0400 | 0.0500 | 0.0471 | 0.0500 | 0.0800 | 0.00624
user  | 0.0400 | 0.0400 | 0.0400 | 0.0426 | 0.0400 | 0.0700 | 0.00562
sys   | 0      | 0      | 0      | 0      | 0      | 0      | 0.00000
rss   | 2608   | 2657   | 2704   | 2728   | 2764   | 2920   | 95.06524
maxschlepzig
la source
1

Option 1 - sqlite :

créer un tableau simple avec des colonnes de commande et de temps et visualiser avec des calculs d' agrégation appropriés . Après le chronométrage, ajoutez une ligne au tableau.

Avantages: définition d'une table plus simple par rapport à la solution 2.

Inconvénients: vous avez besoin (pensez-vous?) De la conservation des données.

Option 2 - rrdtool :

Définissez le fichier de base de données rrd, la définition des données et les fonctions d'agrégation. Après le chronométrage, alimentez la base de données avec rrdtool update ....

Avantages: vous pouvez facilement générer des graphiques avec rrdtool graph .... Pas de problème de conservation des données (base de données round robin).

Inconvénients: un peu plus difficile à définir la base de données rrd par rapport à une table / vue SQL simple

Michał Šrajer
la source