Làm thế nào tôi có thể hồ sơ một kịch bản shell?


10

Tôi có một số chương trình mà tôi đang thực hiện trong một kịch bản shell:

./myprogram1
./myprogram2
...

Tôi biết rằng tôi có thể lập hồ sơ cho từng chương trình riêng lẻ bằng cách chỉnh sửa mã nguồn, nhưng tôi muốn biết liệu có cách nào để tôi có thể đo tổng thời gian thực hiện bằng cách tự cấu hình tập lệnh. Có một chương trình hẹn giờ mà tôi có thể sử dụng cho mục đích này? Nếu vậy, làm thế nào chính xác là đo lường của nó?


có lẽ đây là hồ sơ hữu ích - Làm thế nào để cấu hình một tập lệnh bash shell? - Tràn ngăn xếp -> stackoverflow.com/questions/5014823/ từ
Mohammad Efazati

Câu trả lời:


10

Bắt đầu bằng cách sử dụng thời gian theo đề nghị của Jon Lin:

$ time ls test
test

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

Bạn không nói những gì unix script của bạn đang chạy nhưng strace trên linux, giàn trên Solaris / AIX và tôi nghĩ rằng tusc trên hp-ux cho phép bạn tìm hiểu nhiều về quá trình đang làm gì. Tôi thích tùy chọn -c của strace để có được một bản tóm tắt hay:

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

Cũng lưu ý rằng việc đính kèm các chương trình loại theo dõi này có thể làm chậm chương trình xuống một chút.


Trên thực tế, tôi đang sử dụng Redhat, nhưng tôi cũng bắt đầu sử dụng Debian (ubfox) thường xuyên hơn vào những ngày này.
Paul

4

Kiểm tra timelệnh . Bạn có thể sử dụng nó để đo thời gian cần thiết để thực hiện cùng với một số thông tin hữu ích khác như thời gian được sử dụng.


2

Nó không chính xác hồ sơ, nhưng bạn có thể theo dõi tập lệnh của mình khi nó chạy. Đặt set -xvtrước phần bạn muốn theo dõi và set +xvsau phần. set -xcho phép xtrace, sẽ hiển thị mọi dòng thực thi. set -vcho phép chế độ dài dòng, cũng sẽ hiển thị các dòng có thể có hiệu ứng, nhưng không được thực thi, chẳng hạn như gán biến.

Bạn cũng có thể đánh dấu thời gian theo dõi của bạn. Bạn cần một trình giả lập thiết bị đầu cuối có thể đánh dấu thời gian trên mỗi dòng; người duy nhất tôi biết là RealTerm , một chương trình Windows, nhưng nó sẽ hoạt động với Wine. Bạn cũng có thể sử dụng grabserial, mặc dù tôi chưa thử trừ các cổng nối tiếp thực sự. Bạn có thể tìm ra thiết bị nối tiếp nào mà vỏ của bạn đang sử dụng bằng cách chạy ps -p $$(nếu không, hãy sử dụng manđể tìm hiểu cách đưa cột TTY vào psđầu ra của bạn ).

Ngoài ra, hãy xem các công cụ định hình hiệu suất cho các kịch bản shell trên Stack Overflow.


2

time trong vài lần lặp

Cấu hình bằng cách chạy cùng một lệnh nhiều lần

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

Trong đó echo "scale=1000; 4*a(1)" | bc -ltính toán pi và time (...)đảm bảo rằng forvòng lặp chạy dưới dạng một lệnh duy nhất.


1

Vì tôi đã kết thúc ở đây ít nhất hai lần bây giờ, tôi đã thực hiện một giải pháp:

https://github.com/walles/shellprof

Nó chạy tập lệnh của bạn, đồng hồ trong suốt tất cả các dòng được in và ở cuối in một danh sách 10 dòng hàng đầu trên màn hình dài nhất:

~/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|✔) $
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.