Bir kabuk betiğini nasıl profilleyebilirim?


10

Bir kabuk komut dosyasında yürüttüğüm birkaç program var:

./myprogram1
./myprogram2
...

Kaynak kodunu düzenleyerek her bir programı profilleyebileceğimi biliyorum, ancak betiğin kendisini profilleyerek yürütülen toplam süreyi ölçebileceğim bir yol olup olmadığını bilmek istedim. Bu amaçla kullanabileceğim bir zamanlayıcı programı var mı? Eğer öyleyse, ölçümü ne kadar hassas?


belki bu yardımcı profil oluşturma - Nasıl bir bash kabuk betiği profil? - Yığın Taşması -> stackoverflow.com/questions/5014823/…
Mohammad Efazati

Yanıtlar:


10

Jon Lin'in önerisine göre zamanı kullanmaya başlayın:

$ time ls test
test

real    0m0.004s
user    0m0.002s
sys     0m0.002s

Senaryolarınızın hangi unix üzerinde çalıştığını söylemiyorsunuz ama linux, Solaris / AIX üzerindeki kafes ve bence hp-ux'daki tusc bir işlemin ne olduğu hakkında çok şey öğrenmenize izin veriyor. Güzel bir özet almak için strace'nin -c seçeneğini seviyorum:

]$ strace -c ls
test
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 89.19    0.000998         998         1           execve
 10.81    0.000121         121         1           write
  0.00    0.000000           0        12           read
  0.00    0.000000           0        93        79 open
  0.00    0.000000           0        16           close
  0.00    0.000000           0         2         1 access
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         4           munmap
  0.00    0.000000           0         1           uname
  0.00    0.000000           0         6           mprotect
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0        30           mmap2
  0.00    0.000000           0         8         7 stat64
  0.00    0.000000           0        13           fstat64
  0.00    0.000000           0         2           getdents64
  0.00    0.000000           0         1           fcntl64
  0.00    0.000000           0         1           futex
  0.00    0.000000           0         1           set_thread_area
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           socket
  0.00    0.000000           0         1         1 connect
------ ----------- ----------- --------- --------- ----------------
100.00    0.001119                   205        88 total

Ayrıca, bu izleme türü programların eklenmesinin programı biraz yavaşlatabileceğini unutmayın.


Aslında, çoğunlukla Redhat kullanıyorum, ama bugünlerde de Debian'ı (ubuntu) daha sık kullanmaya başlıyorum.
Paul

4

timeKomutu kontrol et . Zamanın harcandığı yer gibi diğer faydalı bilgilerle birlikte yürütülmesi gereken süreyi ölçmek için kullanabilirsiniz.


2

Tam olarak profil oluşturma değildir, ancak komut dosyanızı çalıştıkça izleyebilirsiniz. İzlemek set -xvistediğiniz bölümden önce ve bölümden set +xvsonra koyun . set -xçalıştırılan her satırı gösterecek olan xtrace özelliğini etkinleştirir. set -vdeğişken atama gibi bir etkisi olabilecek ancak yürütülmeyen satırları da gösteren ayrıntılı modu etkinleştirir.

Ayrıca izinizi zaman damgası da ekleyebilirsiniz. Her satıra zaman damgası atabilecek bir terminal emülatörüne ihtiyacınız var; bildiğim tek şey bir Windows programı olan RealTerm , ancak Wine ile çalışacak. grabserialGerçek seri bağlantı noktaları dışında denememe rağmen , kullanabilirsiniz . Kabuğunuzun hangi seri aygıtı ps -p $$kullandığını manöğrenebilirsiniz (eğer değilse, TTY sütununu psçıktınıza nasıl dahil edeceğinizi öğrenmek için kullanın ).

Ayrıca bkz . Yığın Taşması'ndaki kabuk komut dosyaları için performans profili oluşturma araçları .


2

time birkaç tekrar için

Aynı komutu birden çok kez çalıştırarak profil oluşturma

time (for ((n=0;n<10;n++)); do echo "scale=1000; 4*a(1)" | bc -l; done)

Burada echo "scale=1000; 4*a(1)" | bc -lpi'yi hesaplar ve döngünün tek bir komut olarak çalışmasını time (...)sağlar for.


1

En az iki kez buraya geldiğim için bir çözüm uyguladım:

https://github.com/walles/shellprof

Komut dosyanızı çalıştırır, yazdırılan tüm satırları şeffaf bir şekilde saatler ve sonunda ekranda en uzun satırların en iyi 10 listesini yazdırır:

~/s/shellprof (master|✔) $ ./shellprof ./testcase.sh
quick
slow
quick

Timings for printed lines:
1.01s: slow
0.00s: <<<PROGRAM START>>>
0.00s: quick
0.00s: quick
~/s/shellprof (master|✔) $
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.