La création d'un processus et le chargement d'un nouvel exécutable prendront probablement quelques millisecondes, donc ce type de précision n'a pas vraiment de sens. Notez également que le temps CPU sur de nombreux systèmes est alloué aux processus par tranches allant jusqu'à 10 ms.
Cela dit, certaines sleep
implémentations prennent un nombre fractionnaire de secondes, et zsh et ksh93 peuvent tous deux $SECONDS
fractionner leur variable spéciale avec typeset -F SECONDS
.
Exemple (zsh):
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((1./70)); date +%s.%N; done | { head -n3;echo ..;tail -n3; }; echo $SECONDS
1350076317.374870501
1350076317.391034397
1350076317.407278461
..
1350076318.464585550
1350076318.480887660
1350076318.497133050
1.1393780000
Oups, il a dérivé. Vous pouvez ajuster le temps de sommeil en fonction de $SECONDS
:
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((i/70. - SECONDS)); date +%s.%N; done | { head -n3;echo ...;tail -n3; }; echo $SECONDS
1350076420.262775654
1350076420.277012997
1350076420.291302750
../..
1350076421.219682227
1350076421.234134663
1350076421.248255685
1.0020580000
Ces 2 millisecondes supplémentaires doivent probablement être prises en compte pour l'exécution des dernières commandes sleep
et date
.
Notez également que zsh a une fonction zselect
intégrée avec un délai d'expiration exprimé en centième de seconde. Et ksh93 a sleep
intégré (et accepte les virgules flottantes) et sa printf
peut imprimer la date / heure.
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do ((i<4 || i>67)) && printf '%(%S.%N)T\n' now; sleep $((i/70.-SECONDS)); done; echo $SECONDS
20.823349000
20.837510000
20.851663000
21.780099000
21.794254000
21.808405000
0.9992358685
Si vous voulez quelque chose de plus précis, vous voudrez probablement un système d'exploitation en temps réel ou un système d'exploitation avec des capacités en temps réel et certainement pas utiliser un shell.