Untuk membandingkan menjalankan kali skrip antara kerang yang berbeda, beberapa jawaban SE menyarankan menggunakan bash
's built-in time
perintah, seperti:
time bash -c 'foo.sh'
time dash -c 'foo.sh'
... dll , untuk setiap shell untuk diuji. Tolok ukur seperti itu gagal menghilangkan waktu yang dibutuhkan setiap shell untuk memuat dan menginisialisasi sendiri . Sebagai contoh, misalkan kedua perintah di atas disimpan pada perangkat yang lambat dengan kecepatan baca dari floppy disk awal , (124KB / dtk), dash
(a ~ 150K dieksekusi) akan memuat sekitar 7x lebih cepat daripada bash
( ~ 1M ), shell waktu pemuatan akan memiringkan time
angka - waktu pra-pemuatan kerang-kerang tersebut tidak relevan untuk mengukur waktu proses di foo.sh
bawah setiap kerang setelah kerang dimuat.
Apa kegunaan portabel dan umum terbaik untuk menjalankan skrip waktu yang dapat dijalankan dari dalam setiap shell? Jadi kode di atas akan terlihat seperti:
bash -c 'general_timer_util foo.sh'
dash -c 'general_timer_util foo.sh'
NB: tidak ada perintah built-in shell time
, karena tidak ada yang portabel atau umum.
Lebih baik lagi jika util juga dapat membuat tolok ukur waktu yang diambil oleh perintah internal dan jaringan pipa shell, tanpa pengguna harus terlebih dahulu membungkusnya dalam skrip. Sintaks buatan seperti ini akan membantu:
general_timer_util "while read x ; do echo x ; done < foo"
Beberapa kerang time
dapat mengatur ini. Misalnya bash -c "time while false ; do : ; done"
berfungsi. Untuk melihat apa yang berfungsi, (dan tidak) pada sistem Anda, coba:
tail +2 /etc/shells |
while read s ; do
echo $s ; $s -c "time while false ; do : ; done" ; echo ----
done
/usr/bin/time
?Jawaban:
Anda harus mencatat bahwa
time
ditentukan oleh POSIX , dan AFAICT satu-satunya opsi yang POSIX sebutkan (-p
) didukung dengan benar oleh berbagai shell:sumber
time
. Ini sebanding dengan membiarkan pelari cepat mengukur waktu mereka sendiri pada 100m, secara individual, daripada melakukannya dengan satu jam pada waktu yang sama. Ini jelas-jelas membingungkan, tapi tetap saja ...time
itu tidak portabel; tampaknya portabel. (Saya setuju dengan poin Anda tentang komparatif)dash -c 'time -p while false ; do : ; done'
mengembalikan "waktu: tidak dapat berjalan sementara: Tidak ada file atau direktori seperti itu <cr> Perintah keluar dengan kesalahan status 127" .Saya menggunakan perintah GNU
date
, yang mendukung timer resolusi tinggi:Dan kemudian saya memanggil skrip seperti ini:
Unit output dalam milidetik.
sumber
date
khusus.START
danEND
diatur, maka ini jelas akan mempengaruhi hasil Anda. Tidak tahu seberapa tepat Anda membutuhkannya dan apakah itu penting dalam kasus Anda, tetapi seperti yang saya katakan, sesuatu yang perlu diingat. (Kisah menyenangkan: Saya tahu sebuah perangkat lunak di mana tepatnya itu mengarah pada hasil negatif yang tak terduga - digunakan untuk menghitung perhitungan - yang kemudian memecahkan beberapa hal.)The
time
utilitas biasanya dibangun ke shell, seperti yang Anda telah memperhatikan, yang membuatnya berguna sebagai timer "netral".Namun, utilitas biasanya juga tersedia sebagai utilitas eksternal
/usr/bin/time
,, yang dapat digunakan untuk melakukan eksperimen pengaturan waktu yang Anda usulkan.sumber
foo.sh
dieksekusi dan memiliki shebang, maka ini selalu menjalankannya dengan shell yang sama, dan ia menghitung waktu startup shell itu, jadi ini bukan yang diinginkan OP. Jikafoo.sh
salah satu dari itu hilang, maka ini tidak berfungsi sama sekali.time
mempertimbangkan "no built-in shell ". Waktu startup shell mungkin harus diukur secara terpisah.time
perintah builtin. Namun banyak kerang termasukbash
memilikitime
kata kunci yang dapat digunakan untuk menentukan waktu pipa. Untuk menonaktifkan kata kunci itu sehinggatime
perintah (dalam sistem file) digunakan, Anda dapat mengutipnya seperti"time" foo.sh
. Lihat juga unix.stackexchange.com/search?q=user%3A22565+time+keywordBerikut ini solusinya:
Ada dua bagian: program C pendek yang membungkus
gettimeofday
, yang sudah usang tetapi masih lebih portabel daripadaclock_gettime
, dan skrip shell pendek yang menggunakan program itu untuk mendapatkan jam presisi mikrodetik membaca kedua sisi sumber skrip. Program C adalah satu-satunya cara portabel dan overhead minimal untuk mendapatkan ketepatan sub-detik pada timestamp.Berikut adalah program C
epoch.c
:Dan skrip shell
timer
:Ini adalah bahasa perintah shell standar dan
bc
dan harus berfungsi sebagai skrip di bawah setiap shell yang kompatibel dengan POSIX.Anda dapat menggunakan ini sebagai:
Itu tidak mengukur waktu sistem atau pengguna, hanya jam dinding non-monoton yang berlalu. Jika jam sistem berubah selama eksekusi skrip, ini akan memberikan hasil yang salah. Jika sistem sedang dimuat, hasilnya akan tidak dapat diandalkan. Saya tidak berpikir sesuatu yang lebih baik bisa dibawa-bawa di antara cangkang.
eval
Skrip pengatur waktu yang dimodifikasi dapat digunakan untuk menjalankan perintah di luar skrip.sumber
eval
), saya mengutak - atik naskah dalam jawaban Rabin untuk dimasukkaneval "$@"
, sehingga bisa menjalankan builtin shell dengan cepat.Beberapa kali solusi yang direvisi menggunakan
/proc/uptime
dandc
/bc
/awk
sebagian besar berkat input oleh AGC :Berasumsi jelas bahwa
/proc/uptime
ada dan memiliki bentuk tertentu.sumber
/proc
file. Jika ini masalah atau tidak, saya tidak tahu.awk
dapat menjadi signifikan. Mungkinb=$(cat /proc/uptime)
sebelum, lalua=$(cat /proc/uptime)
setelah, lalu parsing $ a dan $ b dan kurangi.read
lebih baik daricat
, ini akan menjadi bersih (dan sedikit lebih cepat):read before dummyvar < /proc/uptime ;sleep 2s;read after dummyvar < /proc/uptime; duration=$(dc -e "${after} ${before} - n");echo "It took $duration seconds."