Нерестування процесу та завантаження в нього нового виконуваного файлу, ймовірно, займе кілька мілісекунд, тому така точність насправді не має сенсу. Також зауважте, що час процесора в багатьох системах розподіляється на процеси за допомогою фрагментів до 10 мс.
Сказавши це, деякі sleep
реалізації займають дробові числа секунд, і zsh і ksh93 можуть зробити свою $SECONDS
спеціальну змінну дробовою typeset -F SECONDS
.
Приклад (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
На жаль, воно дрейфувало. Ви можете налаштувати час сну виходячи з $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
Ці 2 зайвих мілісекунди, ймовірно, слід враховувати для запуску останньої sleep
та date
команд.
Також зауважте, що zsh має zselect
вбудований тайм-аут, виражений у соті секунди. І ksh93 має sleep
вбудований (і приймає плаваючі точки) і printf
може друкувати дату / час.
$ 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
Якщо ви хочете щось більш точне, ви, ймовірно, захочете операційну систему в режимі реального часу або операційну систему з можливостями в режимі реального часу і, звичайно, не використовувати оболонку.