プロセスを生成してその中に新しい実行可能ファイルをロードするのに数ミリ秒かかる可能性が高いため、そのような精度は実際には意味をなしません。また、多くのシステムのCPU時間は、最大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
100分の1秒単位で表されるタイムアウトが組み込まれていることに注意してください。また、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
あなたはより正確な何かをしたい場合は、おそらくリアルタイム機能を備えたリアルタイム・オペレーティング・システムまたはオペレーティング・システムをお勧めしますし、確かにないシェルを使用しています。