Bagaimana saya bisa membuat profil skrip shell?

10

Saya memiliki beberapa program yang saya jalankan dalam skrip shell:

./myprogram1
./myprogram2
...

Saya tahu bahwa saya dapat membuat profil setiap program dengan mengedit kode sumber, tetapi saya ingin tahu apakah ada cara saya bisa mengukur total waktu yang dieksekusi dengan membuat profil skrip itu sendiri. Apakah ada program pengatur waktu yang dapat saya gunakan untuk tujuan ini? Jika demikian, seberapa akurat pengukurannya?

Paul
sumber
mungkin ini membantu profil - Bagaimana cara membuat profil skrip bash shell? - Stack Overflow -> stackoverflow.com/questions/5014823/…
Mohammad Efazati

Jawaban:

10

Mulailah dengan menggunakan waktu sesuai saran Jon Lin:

$ time ls test
test

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

Anda tidak mengatakan apa unix skrip Anda berjalan tetapi strace di linux, truss pada Solaris / AIX, dan saya pikir tusc pada hp-ux memungkinkan Anda belajar banyak tentang apa yang sedang dilakukan proses. Saya suka opsi -c strace untuk mendapatkan ringkasan yang bagus:

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

Perhatikan juga bahwa melampirkan program jenis penelusuran ini dapat memperlambat program.

davey
sumber
Sebenarnya, saya lebih banyak menggunakan Redhat, tetapi saya mulai lebih sering menggunakan Debian (ubuntu).
Paul
4

Lihat timeperintahnya . Anda dapat menggunakannya untuk mengukur waktu yang diperlukan untuk mengeksekusi bersama dengan beberapa info berguna lainnya seperti di mana waktu yang dihabiskan.

Jon Lin
sumber
2

Ini bukan profil yang tepat, tetapi Anda dapat melacak skrip saat dijalankan. Letakkan set -xvsebelum bagian yang ingin Anda lacak dan set +xvsetelah bagian. set -xmemungkinkan xtrace, yang akan menampilkan setiap baris yang dieksekusi. set -vmengaktifkan mode verbose, yang juga akan menampilkan baris yang mungkin memiliki efek, tetapi tidak dieksekusi, seperti penugasan variabel.

Anda juga dapat cap waktu jejak Anda. Anda memerlukan emulator terminal yang dapat mencatat waktu setiap baris; satu-satunya yang saya tahu adalah RealTerm , yang merupakan program Windows, tetapi akan bekerja dengan Wine. Anda mungkin juga dapat menggunakan grabserial, meskipun saya belum mencobanya kecuali dengan port serial nyata. Anda dapat mengetahui perangkat serial apa yang digunakan shell Anda dengan menjalankan ps -p $$(jika tidak, gunakan manuntuk mencari tahu bagaimana memasukkan kolom TTY dalam psoutput Anda ).

Juga, lihat Alat profil kinerja untuk skrip shell di Stack Overflow.

Shawn J. Goff
sumber
2

time untuk beberapa iterasi

Membuat profil dengan menjalankan perintah yang sama beberapa kali

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

Di mana echo "scale=1000; 4*a(1)" | bc -lmenghitung pi dan time (...)memastikan bahwa forloop berjalan sebagai satu perintah.

Anton Tarasenko
sumber
1

Karena saya telah berakhir di sini setidaknya dua kali sekarang, saya menerapkan solusi:

https://github.com/walles/shellprof

Ini menjalankan skrip Anda, secara transparan menandai semua baris yang dicetak, dan pada akhirnya mencetak daftar 10 baris teratas yang ada di layar terpanjang:

~/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
sumber