Jak mogę profilować skrypt powłoki?

10

Mam kilka programów, które uruchamiam w skrypcie powłoki:

./myprogram1
./myprogram2
...

Wiem, że mogę profilować każdy program, edytując kod źródłowy, ale chciałem wiedzieć, czy istnieje sposób, aby zmierzyć całkowity czas wykonywany przez profilowanie samego skryptu. Czy istnieje program czasowy, którego można użyć do tego celu? Jeśli tak, to jak dokładny jest jego pomiar?

Paweł
źródło
może to pomocne profilowanie - Jak profilować skrypt powłoki bash? - Przepełnienie stosu -> stackoverflow.com/questions/5014823/...
Mohammad Efazati

Odpowiedzi:

10

Zacznij od wykorzystania czasu zgodnie z sugestią Jona Lin:

$ time ls test
test

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

Nie mówisz, na jakim uniksie działają twoje skrypty, ale strace na Linuksie, truss na Solaris / AIX, i myślę, że tusc na hp-ux pozwala ci wiele dowiedzieć się o tym, co robi proces. Podoba mi się opcja strace -c, aby uzyskać ładne podsumowanie:

]$ 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

Należy również pamiętać, że dołączenie tych programów typu śledzenia może nieco spowolnić program.

davey
źródło
Właściwie używam głównie Redhata, ale w dzisiejszych czasach zaczynam też używać Debiana (ubuntu).
Paul
4

Sprawdź timepolecenie . Możesz go użyć do pomiaru czasu potrzebnego do wykonania wraz z innymi przydatnymi informacjami, takimi jak miejsce spędzania czasu.

Jon Lin
źródło
2

Nie jest to dokładnie profilowanie, ale można śledzić skrypt podczas jego działania. Umieść set -xvprzed sekcją, którą chcesz śledzić, i set +xvza sekcją. set -xwłącza xtrace, który pokaże każdą wykonaną linię. set -vwłącza tryb gadatliwy, który pokaże również linie, które mogą mieć efekt, ale nie są wykonywane, takie jak przypisanie zmiennych.

Możesz także datownikować swój ślad. Potrzebujesz emulatora terminala, który może sygnalizować czasowo każdą linię; Jedyne, o czym wiem, to RealTerm , który jest programem Windows, ale będzie działał z Wine. Możesz także być w stanie używać grabserial, chociaż nie próbowałem tego, z wyjątkiem prawdziwych portów szeregowych. Możesz dowiedzieć się, z jakiego urządzenia szeregowego korzysta twoja powłoka, uruchamiając ps -p $$(jeśli nie, użyj, manaby dowiedzieć się, jak dołączyć kolumnę TTY do swoich pswyników).

Zobacz także Narzędzia do profilowania wydajności dla skryptów powłoki w przepełnieniu stosu.

Shawn J. Goff
źródło
2

time przez kilka iteracji

Profilowanie poprzez wielokrotne uruchomienie tego samego polecenia

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

Gdzie echo "scale=1000; 4*a(1)" | bc -loblicza pi i time (...)zapewnia, że forpętla działa jako pojedyncze polecenie.

Anton Tarasenko
źródło
1

Ponieważ znalazłem się tutaj przynajmniej dwa razy, wdrożyłem rozwiązanie:

https://github.com/walles/shellprof

Uruchamia skrypt, transparentnie taktuje wszystkie wydrukowane linie, a na końcu drukuje listę 10 najlepszych linii, które były najdłuższe na ekranie:

~/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|✔) $
Johan Walles
źródło