OVH Cloud OVH Cloud

Millisecondes en commande shell ?

5 réponses
Avatar
xavier
Bonjour, j'ai beau me creuser la tête et le manpages, je ne vois pas de
commande qui me permette d'avoir une précision plus fine que la seconde
dans un script shell (j'ai un gros script que je voudrais profiler)

Un wrapper de microtime(9), quoi.

J'ai mal regarder, ou bien c'est just do it ?

Merci,

XAv
--
Xavier HUMBERT
INJEP - NetBSD, parce que je le vaux bien

5 réponses

Avatar
Laurent Wacrenier
Xavier HUMBERT écrit:
Bonjour, j'ai beau me creuser la tête et le manpages, je ne vois pas de
commande qui me permette d'avoir une précision plus fine que la seconde
dans un script shell (j'ai un gros script que je voudrais profiler)


man time

Avatar
Pascal Bourguignon
(Xavier HUMBERT) writes:

Bonjour, j'ai beau me creuser la tête et le manpages, je ne vois pas de
commande qui me permette d'avoir une précision plus fine que la seconde
dans un script shell (j'ai un gros script que je voudrais profiler)

Un wrapper de microtime(9), quoi.

J'ai mal regarder, ou bien c'est just do it ?


Il n'y a pas. De toutes façons, le time slice étant de 100 ou 160 ms,
ça n'a pas de sens d'essayer de dormir une fraction de seconde. Si tu
as vraiment besoin d'une telle précision, il ne faut pas programmer en
shell, mais en C.

--
__Pascal Bourguignon__ http://www.informatimago.com/

There is no worse tyranny than to force a man to pay for what he does not
want merely because you think it would be good for him. -- Robert Heinlein

Avatar
Laurent Wacrenier
Xavier écrit:
Oui, mais il faut une commande, et de toutes façonsce que je veux est
répupérer "time.milliseconds"


Encore faut il que la granularité du système soit à la miliseconde.

- je veux mesurer le temps d'exécution d'une fonction appelée par mon
script, avec une précision un peu plus fine que peut me
donner $(date +%s) : si (Murphy veille) tous les arrondis sont vers la
seconde supérieure, au bout de 1000 itérations, l'erreur sera énorme.
Par contre le 1/10 de seconde me suffit.


Si le temps est faible, ça ne sera pas significatif.

On peut avoir le temps passé par ci par là à l'aide de
strace/ktrace/truss avec "set -x" dans le script.

Sur FreeBSD, on peut avoir les temps systemes et utilisateurs dans
/proc/$$/status, c'est tout de même plus précis que le temps réél.

Bon, c'est parti pour wrapper microtime(9). C'est l'affaire de 5
minutes, à peine le temps de finir ma bière.


5 secondes suffisent:

perl -MTime::HiRes=time -le 'print time'

Avatar
Laurent Wacrenier
Xavier écrit:
Laurent Wacrenier wrote:

5 secondes suffisent:

perl -MTime::HiRes=time -le 'print time'


Le temps passé à lancer une instance de perl risque de fausser un poil
la mesure. Sinon tu penses bien que c'est la première chose à laquelle
j'ai pensé !


Tu la lances deux fois, comme ça tu sais combien de temps elle dure.


Avatar
Stephane Le Men
Xavier HUMBERT wrote:
Bonjour, j'ai beau me creuser la tête et le manpages, je ne vois pas de
commande qui me permette d'avoir une précision plus fine que la seconde
dans un script shell (j'ai un gros script que je voudrais profiler)

Un wrapper de microtime(9), quoi.


Lance ton script dans un user de test, en ayant au préalable, activé
le process accounting sur ton system avec accton. Sous mon BSD, la
precision est a 10ms. Mais en changeant le "%6.2f" des printf de
lastcomm, tu dois pouvoir acceder a la milliseconde de time.

dans tous le fratra que te sortira lastcomm, pour identifier le corps
des boucles, je te conseille de substituer la premiere et derniere
commande qui les encadre par des liens hard d'un autre nom. Ca te
permettra d'identifier l'entre et la sortie de ta boucle, sans que
ce marquage influence (ou peu) ton script.

Et reduire nombre de reps dans ton PATH, ou utiliser des path absolus,
ca mets de l'EPO dans le sang de ton shell sans abimer son petit coeur.