Memunculkan proses dan memuat executable baru di dalamnya kemungkinan akan memakan waktu beberapa milidetik, sehingga ketepatan seperti itu tidak masuk akal. Perhatikan juga bahwa waktu CPU pada banyak sistem dialokasikan untuk proses dengan irisan hingga 10 ms.
Karena itu, beberapa sleep
implementasi mengambil bilangan pecahan detik, dan baik zsh dan ksh93 dapat membuat $SECONDS
pecahan variabel khusus mereka typeset -F SECONDS
.
Contoh (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
Ups, itu melayang. Anda dapat menyesuaikan waktu tidur berdasarkan $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 milidetik tambahan itu mungkin harus dipertanggungjawabkan untuk menjalankan yang terakhir sleep
dan date
perintah.
Perhatikan juga bahwa zsh memiliki zselect
builtin dengan batas waktu dinyatakan dalam seperseratus detik. Dan ksh93 memiliki sleep
built in (dan menerima floating point) dan printf
dapat mencetak tanggal / waktu.
$ 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
Jika Anda menginginkan sesuatu yang lebih tepat, Anda mungkin menginginkan sistem operasi waktu nyata atau sistem operasi dengan kemampuan waktu nyata dan tentu saja tidak menggunakan shell.