Comment obtenir le temps d'exécution de Bash en millisecondes sous Mac OS X?

12

J'ai vérifié cela , mais la solution fournie n'a pas fonctionné pour moi.

En utilisant la date, je peux obtenir le temps d'exécution en secondes:

T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"

Cependant, quand j'essaye ceci:

T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"

L'ajout de% N (comme ci-dessus) à la date pour obtenir la précision en nanosecondes, j'obtiens l'erreur suivante: -bash: 1369320760N: valeur trop grande pour la base (le jeton d'erreur est "1369320760N")

Quelqu'un sait-il comment mesurer le temps d'exécution en millisecondes en utilisant bash sous Mac OS X?

pacodelumberg
la source
Avez-vous vraiment besoin d'une nano seconde résolution? Quelle cette approche vous avez beaucoup de frais généraux. Avec # some work hereommited, j'obtiens des temps de 0,2 à 0,3 sec - ce qui devrait être zéro (ou au moins constant) pour atteindre votre objectif. Alors que /usr/bin/time usleep 50000donne un temps stable raisonnablement de 0,05 +/- 0,01 sec. (Testé uniquement sous Linux, je ne sais pas si / usr / bin / time et / ou usleep est disponible sur OSX.)
mpy
Êtes-vous sûr que la résolution d'horloge interne offre une résolution PRÉCISE jusqu'au niveau de la nano-seconde?
mdpc

Réponses:

14

Puisque OSX est un système BSD, sa bibliothèque strftime n'en a pas %N( http://www.freebsd.org/cgi/man.cgi?query=date )

La timecommande bash builtin vous donne- t-elle les informations dont vous avez besoin?

time some work here
glenn jackman
la source
2
merci d'avoir précisé, le temps fonctionne parfaitement et produit trois résultats, mais je dois travailler spécifiquement avec les temps initial et final.
pacodelumberg
11

J'irais dans cette voie si j'avais besoin de millisecondes et que BSD ne supportait pas la date +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'
hpavc
la source
Merci!!! C'est LA solution que personne ne rapportait ...
Daniele B
3

echo $(($(date +%s%N)/1000000))

Cela convertirait des nano-secondes en milli-secondes.

De @mpy, date +%s.%Nfonctionne.

La sortie est différente entre linux et OS X:
linux: 1369322592.573787111
OS X:1369322610.N

sage
la source
J'obtiens l'erreur suivante: -bash: 1369321446N: valeur trop grande pour la base (le jeton d'erreur est "1369321446N") cela ne fonctionne pas sous mac osx,
j'obtiens
Eh bien, c'est ennuyeux ... (testé sur la mauvaise fenêtre) voyant la même erreur: /
sage
1
Pas besoin de diviser la sortie, utilisez simplement date +%s.%N(mais je ne peux pas vérifier sur OSX; cela fonctionne sur Linux). Mais le problème est donc que bashde » à $(( ))mon humble avis n'est pas en mesure de traiter les nombres à virgule flottante.
mpy
@mpy Cela fonctionne sur osx. Même chose pour les 10 premiers caractères, mais agit différemment entre Linux et OS X.
sage
Cela signifie-t-il que nous ne pouvons pas obtenir les nano secondes d'informations en utilisant la date?
pacodelumberg
3

Si vous installez, coreutilsvous pouvez utiliser GNU Linux dateen écrivant gdate.

coreutils est disponible avec Homebrew: brew install coreutils.

youyoup
la source
1

Comme l'autre réponse l'a mentionné, la date d'OS X ne prend pas en charge% N (nanosecondes).

Pourriez-vous simplement enregistrer les commandes à temps en tant que script? Ou utilisez un sous-shell ou un groupe de commandes pour eux:

time (sleep 0.1; echo a; sleep 0.1)
time { sleep 0.1; echo a; sleep 0.1; }

Ou additionnez les temps des commandes individuelles:

$ time=$(TIMEFORMAT=%R; (time sleep 0.1; echo a) 2>&1 > /dev/null)
$ time+=+$(TIMEFORMAT=%R; (time sleep 0.1) 2>&1)
$ bc <<< $time
.206

Ou utilisez un langage de script:

$ ruby -e 'puts "%.3f" % Time.now'
1369329611.046
$ time ruby -e '""'
0.029
$ time ruby -e 'puts "%.3f" % Time.now'
1369329622.943
0.029

%.3fest un spécificateur de format pour un nombre à virgule flottante avec 3 décimales. Time.now est une méthode de classe de la classe Time.

Lri
la source
Merci pour votre réponse, pourriez-vous s'il vous plaît décrire le code rubis ci-dessus?
pacodelumberg
1
Dans ruby -e 'puts "%.3f" % Time.now', rubyappelle l'interpréteur ruby, -eexécute le script qui suit sur la ligne de commande. putsest rubis printf(en quelque sorte), Timeest un objet rubis et Time.nowest la seconde depuis l'époque. L'utilisation %.3fréduit la sortie à 3 décimales, ce qui correspond à des millisecondes (les parties ".046" et ".943" de la sortie.)
Olie
1
Il times'agit également d'un outil de ligne de commande qui multiplie le temps nécessaire à l'exécution de la commande suivante. Voir man timepour plus de détails.
Olie
1

Glenn a raison, timec'est la commande que vous recherchez, mais pour analyser les informations que vous souhaitez, vous devrez les transmettre à un autre processeur comme sed.

time command-goes-here >/dev/null 2>$1|sed rules-go-here

Cette commande supprimera la sortie de la commande elle-même (en envoyant les sorties standard et d'erreur à / dev / null), et passera les résultats temporels à sed, où vous devrez choisir les règles appropriées pour éditer le flux et produire la valeur souhaitée.

Zach Melnick
la source