Bir kabuk komutunun yürütme zamanını yazdır


89

Aşağıdaki kombinasyonla bir kabuk komutunun yürütme zamanını yazdırmak mümkün müdür?

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

Yanıtlar:


73

Bash'in yerleşik yapısı time(bunu yaptığınızda varsayılan olarak çağrılmalıdır time command) ile /usr/bin/time(tam yolu ile çağırmanızı gerektiren ) arasında bir fark olduğunu unutmayın .

Yerleşik timeher zaman stderr'e yazdırır, ancak /usr/bin/timezamanın çıktısını belirli bir dosyaya göndermenize izin verir, böylece yürütülen komutun stderr akışına müdahale etmezsiniz. Ayrıca, /usr/bin/time'ın biçimi komut satırında veya ortam değişkeniyle yapılandırılabilirken , TIMEbash'ın yerleşik timebiçimi yalnızcaTIMEFORMAT ortam değişkeni tarafından yapılandırılır .

$ 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

Kimden man bash: "TIMEFORMAT değişkeni, zamanlama bilgilerinin nasıl görüntüleneceğini belirten bir biçim dizesine ayarlanabilir"
Dennis Williamson

Oops - Biçimlendirmenin bir yolu olduğunu düşünmüştüm ama gözden kaçırdım help timeçünkü sadece baktım ve bunun bir komut satırı argümanı olduğunu düşündüm. Cevabı güncelleyeceğim.
Mark Rushakoff

3
İşte 9 yıl sonra buradayız ve komut sadece 0m0.018s aldı. Ben sadece bunu göstereyim dedim.
Ghassen Louhaichi

112

time çoğu kabukta çalıştırma zamanı bilgisini tty'ye yazan yerleşik bir komuttur.

Şunun gibi bir şey de deneyebilirsin

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

Veya içinde bash:

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s

Maaza ile aynı fikirdeyken, bu esneklik bütün bir komut dizisinin zamanını ölçmeme izin verdi.
Nath


2
Bu yaklaşımın bir dezavantajı, saniyeler içinde ölçüm yaparken timemilisaniyeleri kullanmasıdır. Ve değişkenleri ve hesaplamaları kullanmak zorunda kalmadan bir avuç komutu bir arada zamanlamak istiyorsanız, parantezleri kullanabilirsiniz: time ( command1 ; command2 ; command3 )onları ayrı ayrı ve toplam süre ile birlikte time ( time command1 ; time command2 ; time command3 ) zamanlayabilirsiniz, şöyle ki: Elbette, yirmi kadar komut istiyorsanız, bu cevabın çözümünü kullanmak daha iyi olur. Ama sonra, tüm komutlarınızı bir komut dosyasına koymayı düşünmeye başlamalısınız ...
msb

26
root@hostname:~# time [command]

Aynı zamanda kullanılan gerçek zaman ve kullanılan sistem zamanı arasında ayrım yapar.


Bu kesinlikle temel cevap - ancak komuttan hata çıktısını görmek ve yine de zamanlama bilgisini sorunun yaptığı gibi standart çıktıya göndermek istiyorsanız bazı zorluklar vardır. Time komutu stderr'e yazar. Önerdiğiniz şey muhtemelen yeterince doğrudur - dolayısıyla + 1'im.
Jonathan Leffler

2
timetty'ye yazar, stderr'e değil. Sanırım işleri daha da kötüleştiriyor.
mafya

13

Satır satır delta ölçümü için gnonom'u deneyin .

Zaman damgası bilgilerini başka bir komutun standart çıktısına eklemek için biraz moreutils'in ts'sine benzeyen bir komut satırı yardımcı programıdır. Bu kadar uzun sürenlerin tarihsel kaydını istediğiniz uzun süreli süreçler için kullanışlıdır.

Herhangi bir şeyi gnomon'a borulamak, her satırın başına bir zaman damgası ekleyerek bu satırın arabellekteki son satırın ne kadar uzun olduğunu, yani bir sonraki satırın görünmesinin ne kadar sürdüğünü belirtir. Varsayılan olarak, gnomon her satır arasında geçen saniyeleri gösterecektir, ancak bu yapılandırılabilir.

gnomon demosu


8

@ Mob cevabına ekleniyor:

Ekleme %Niçin date +%sbize nanosaniye doğruluğunu verir:

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

5

Kopya veya karma gibi uzun soluklu bir işleme başlıyorsam ve daha sonra ne kadar sürdüğünü öğrenmek istersem, sadece şunu yaparım:

$ date; sha1sum reallybigfile.txt; date

Bu, aşağıdaki çıktıyla sonuçlanacaktır:

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

Kabul edilirse, burada uygulandığı şekliyle çok kesin değildir ve geçen süreyi hesaplamaz. Ancak bu çok basit ve bazen ihtiyacınız olan tek şey.


4

Zsh'da kullanabilirsiniz

=time ...

Bash veya zsh'da kullanabilirsiniz

command time ...

Bunlar (farklı mekanizmalarla) harici bir komutu kullanılmaya zorlar.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.