ฉันจะทำโปรไฟล์เชลล์สคริปต์ได้อย่างไร


10

ฉันมีหลายโปรแกรมที่ฉันเรียกใช้งานในเชลล์สคริปต์:

./myprogram1
./myprogram2
...

ฉันรู้ว่าฉันสามารถโปรไฟล์แต่ละโปรแกรมโดยแก้ไขซอร์สโค้ด แต่ฉันต้องการทราบว่ามีวิธีที่ฉันสามารถวัดเวลาทั้งหมดที่ดำเนินการโดยการทำโปรไฟล์สคริปต์เองหรือไม่ มีโปรแกรมจับเวลาที่ฉันสามารถใช้เพื่อวัตถุประสงค์นี้หรือไม่? ถ้าเป็นเช่นนั้นการวัดของมันแม่นยำแค่ไหน?


บางทีนี่อาจเป็นประโยชน์ในการทำโปรไฟล์ - วิธีสร้างโปรไฟล์สคริปต์เชลล์ bash - Stack Overflow -> stackoverflow.com/questions/5014823/…
Mohammad Efazati

คำตอบ:


10

เริ่มต้นด้วยการใช้เวลาตามคำแนะนำของ Jon Lin:

$ time ls test
test

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

คุณไม่ได้พูดถึงสิ่งที่สคริปต์ยูนิกซ์ของคุณทำงานอยู่ แต่ลองดูที่ linux, มัดมือบน Solaris / AIX, และฉันคิดว่า tusc บน hp-ux ให้คุณเรียนรู้มากมายเกี่ยวกับกระบวนการที่กำลังทำอยู่ ฉันชอบตัวเลือก -c ของ strace เพื่อรับบทสรุปที่ดี:

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

โปรดทราบว่าการติดตั้งโปรแกรมประเภทการติดตามเหล่านี้อาจทำให้โปรแกรมช้าลงบ้าง


ที่จริงแล้วฉันใช้ Redhat เป็นส่วนใหญ่ แต่ฉันเริ่มใช้ Debian (Ubuntu) บ่อยขึ้นเช่นกัน
พอล

4

ตรวจสอบคำสั่งtime คุณสามารถใช้มันเพื่อวัดเวลาที่ใช้ในการดำเนินการพร้อมกับข้อมูลที่เป็นประโยชน์อื่น ๆ เช่นเวลาที่ใช้ไป


2

มันไม่ได้เป็นโปรไฟล์ แต่คุณสามารถติดตามสคริปต์ของคุณในขณะที่มันทำงาน ใส่set -xvก่อนส่วนที่คุณต้องการติดตามและset +xvหลังส่วน set -xเปิดใช้งาน xtrace ซึ่งจะแสดงทุกบรรทัดที่ดำเนินการ set -vเปิดใช้งานโหมด verbose ซึ่งจะแสดงบรรทัดที่อาจมีผลกระทบ แต่จะไม่ถูกดำเนินการเช่นการกำหนดตัวแปร

คุณยังสามารถประทับเวลาการติดตามของคุณ คุณต้องใช้เครื่องจำลองเทอร์มินัลที่สามารถประทับเวลาทุกบรรทัด สิ่งเดียวที่ฉันรู้คือRealTermซึ่งเป็นโปรแกรม Windows แต่มันจะทำงานกับไวน์ คุณอาจจะสามารถใช้งานgrabserialได้แม้ว่าฉันจะไม่ได้ลองยกเว้นด้วยพอร์ตอนุกรมจริง คุณสามารถค้นหาว่าอุปกรณ์อนุกรมของคุณใช้เชลล์แบบใดโดยการเรียกใช้ps -p $$(หากไม่มีให้ใช้manเพื่อค้นหาวิธีรวมคอลัมน์ TTY ในpsเอาต์พุตของคุณ)

ดูที่เครื่องมือการทำโปรไฟล์ประสิทธิภาพสำหรับเชลล์สคริปต์บน Stack Overflow


2

time สำหรับการวนซ้ำหลายครั้ง

การทำโปรไฟล์โดยรันคำสั่งเดียวกันหลาย ๆ ครั้ง

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

ที่echo "scale=1000; 4*a(1)" | bc -lคำนวณ pi และtime (...)ทำให้แน่ใจว่าการforวนซ้ำรันเป็นคำสั่งเดียว


1

เนื่องจากฉันสิ้นสุดที่นี่อย่างน้อยสองครั้งในขณะนี้ฉันจึงใช้โซลูชัน:

https://github.com/walles/shellprof

มันรันสคริปต์ของคุณนาฬิกาโปร่งใสทุกบรรทัดที่พิมพ์และในตอนท้ายจะพิมพ์รายการ 10 อันดับแรกของบรรทัดที่อยู่บนหน้าจอที่ยาวที่สุด:

~/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|✔) $
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.