Создание процесса и загрузка в него нового исполняемого файла, вероятно, займет несколько миллисекунд, поэтому такая точность не имеет смысла. Также обратите внимание, что процессорное время во многих системах распределяется между процессами срезами до 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 дополнительные миллисекунды, вероятно, должны быть учтены при запуске команды last 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
Если вы хотите что-то более точное, вы, вероятно, захотите операционную систему реального времени или операционную систему с возможностями реального времени и, конечно, не использовать оболочку.