Cetak waktu eksekusi dari perintah shell

89

Apakah mungkin untuk mencetak waktu eksekusi perintah shell dengan kombinasi berikut?

root@hostname:~# "command to execute" && echo "execution time"
mendongkrak
sumber

Jawaban:

73

Jangan lupa bahwa ada perbedaan antara bash's builtin time(yang harus dipanggil secara default saat Anda melakukannya time command) dan /usr/bin/time(yang mengharuskan Anda untuk memanggilnya dengan jalur lengkapnya).

Builtin timeselalu mencetak ke stderr, tetapi /usr/bin/timeakan memungkinkan Anda untuk mengirim keluaran waktu ke file tertentu, jadi Anda tidak mengganggu aliran stderr perintah yang dieksekusi. Selain itu, /usr/bin/timeformat dapat dikonfigurasi pada baris perintah atau oleh variabel lingkungan TIME, sedangkan timeformat bawaan bash hanya dikonfigurasi oleh TIMEFORMATvariabel lingkungan.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps
Mark Rushakoff
sumber
Dari man bash: "Variabel TIMEFORMAT dapat disetel ke string format yang menentukan bagaimana informasi pengaturan waktu harus ditampilkan"
Dennis Williamson
Ups - Saya pikir ada cara untuk memformatnya, tetapi saya melewatkannya help timekarena saya hanya melihatnya sekilas dan saya pikir itu adalah argumen baris perintah. Saya akan memperbarui jawabannya.
Mark Rushakoff
3
Di sini kita 9 tahun kemudian dan perintahnya hanya membutuhkan 0m0.018s. Saya hanya berpikir saya akan menunjukkan itu.
Ghassen Louhaichi
112

time adalah perintah bawaan di sebagian besar shell yang menulis informasi waktu eksekusi ke tty.

Anda juga bisa mencoba sesuatu seperti

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Atau di bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s
massa
sumber
setuju dengan Maaza, fleksibilitas ini memungkinkan saya untuk mengukur waktu dari seluruh rangkaian perintah.
Nath
Apakah mungkin untuk menerapkan aspek linux di sekitar perintah linux apa pun untuk menghitung eksekusi
Syed Mazreena
2
Satu kelemahan dari pendekatan ini adalah ia mengukur dalam hitungan detik, sedangkan timemenggunakan milidetik. Dan jika Anda ingin time ( command1 ; command2 ; command3 )mengatur waktu beberapa perintah bersama-sama tanpa harus menggunakan variabel dan kalkulasi, Anda dapat menggunakan tanda kurung: Anda bahkan dapat mengatur waktunya secara individual dengan total waktu, seperti: time ( time command1 ; time command2 ; time command3 ) Tentu saja, jika Anda menginginkan sekitar dua puluh perintah, mungkin lebih baik menggunakan solusi jawaban ini. Tapi kemudian, Anda harus mulai berpikir untuk meletakkan semua perintah Anda dalam sebuah skrip ...
msb
26
root@hostname:~# time [command]

Ini juga membedakan antara waktu nyata yang digunakan dan waktu sistem yang digunakan.

Jason
sumber
Itu tentu saja merupakan jawaban dasar - tetapi ada beberapa komplikasi jika Anda ingin melihat keluaran kesalahan dari perintah namun mengirimkan informasi waktu ke keluaran standar seperti yang dilakukan pertanyaan. Perintah waktu menulis ke stderr. Apa yang Anda sarankan mungkin cukup akurat - karena itu +1 saya.
Jonathan Leffler
2
timemenulis ke tty, bukan stderr. Yang kurasa memperburuk keadaan.
mafia
13

Untuk pengukuran delta baris demi baris, coba gnonom .

Ini adalah utilitas baris perintah, mirip dengan ts moreutils, untuk menambahkan informasi stempel waktu ke keluaran standar dari perintah lain. Berguna untuk proses yang berjalan lama di mana Anda menginginkan catatan sejarah tentang apa yang memakan waktu lama.

Mengirimkan apa pun ke gnomon akan menambahkan stempel waktu ke setiap baris, yang menunjukkan berapa lama baris itu menjadi baris terakhir dalam buffer - yaitu, berapa lama baris berikutnya muncul. Secara default, gnomon akan menampilkan detik-detik yang telah berlalu di antara setiap baris, tetapi itu dapat dikonfigurasi.

demo gnomon

Janus Troelsen
sumber
8

Menambahkan jawaban @ mob:

Menambahkan %Nuntuk date +%smemberi kita akurasi nanodetik:

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`
nav
sumber
5

Jika saya memulai proses yang berjalan lama seperti salinan atau hash dan saya ingin tahu nanti berapa lama, saya hanya melakukan ini:

$ date; sha1sum reallybigfile.txt; date

Yang akan menghasilkan keluaran berikut:

Tue Jun  2 21:16:03 PDT 2015
5089a8e475cc41b2672982f690e5221469390bc0  reallybigfile.txt
Tue Jun  2 21:33:54 PDT 2015

Memang, seperti yang diterapkan di sini, ini tidak terlalu tepat dan tidak menghitung waktu yang telah berlalu. Tapi itu sangat sederhana dan terkadang semua yang Anda butuhkan.

Ethan
sumber
4

Dalam zsh Anda dapat menggunakan

=time ...

Di bash atau zsh, Anda dapat menggunakan

command time ...

Ini (dengan mekanisme yang berbeda) memaksa perintah eksternal untuk digunakan.

überRegenbogen
sumber
0

Hanya ps -o etime= -p "<your_process_pid>"

Alejandro Galera
sumber