मैं एक शेल स्क्रिप्ट कैसे प्रोफाइल कर सकता हूं?


10

मेरे पास कई कार्यक्रम हैं जो मैं एक शेल स्क्रिप्ट में निष्पादित कर रहा हूं:

./myprogram1
./myprogram2
...

मुझे पता है कि मैं स्रोत कोड को संपादित करके प्रत्येक व्यक्तिगत कार्यक्रम को प्रोफाइल कर सकता हूं, लेकिन मैं यह जानना चाहता था कि क्या कोई ऐसा तरीका है जो मैं स्क्रिप्ट को स्वयं प्रोफाइल करके निष्पादित किए गए कुल समय को माप सकता हूं। क्या कोई टाइमर कार्यक्रम है जिसे मैं इस उद्देश्य के लिए उपयोग कर सकता हूं? यदि हां, तो इसकी माप कितनी सही है?


शायद यह उपयोगी प्रोफाइलिंग हो - कैसे एक बैश शेल स्क्रिप्ट को प्रोफाइल करें? - ढेर अतिप्रवाह -> stackoverflow.com/questions/5014823/…
मोहम्मद एफ़ाज़ती

जवाबों:


10

जॉन लिन के सुझाव के अनुसार समय का उपयोग करके शुरू करें:

$ time ls test
test

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

आप यह नहीं कहते हैं कि आपकी स्क्रिप्ट्स किस यूनिक्स पर चल रही हैं, लेकिन लिनक्स पर स्ट्रेस, सोलारिस / एआईएक्स पर ट्रस, और मुझे लगता है कि hp-ux पर tusc आपको एक प्रक्रिया क्या कर रही है, इसके बारे में बहुत कुछ सीखने देता है। मुझे एक अच्छा सारांश प्राप्त करने के लिए स्ट्रेस -c विकल्प पसंद है:

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

यह भी ध्यान दें कि इन ट्रेसिंग प्रकार के कार्यक्रमों को संलग्न करने से कार्यक्रम कुछ हद तक धीमा हो सकता है।


असल में, मैं ज्यादातर रेडहैट का उपयोग कर रहा हूं, लेकिन मैं इन दिनों डेबियन (उबंटू) का उपयोग करना शुरू कर रहा हूं।
पॉल

4

की जाँच करें timeआदेश । आप इसका उपयोग उस समय को मापने के लिए कर सकते हैं जिसमें कुछ अन्य उपयोगी जानकारी जैसे कि समय व्यतीत हो रहा है, के साथ निष्पादित होता है।


2

यह बिल्कुल रूपरेखा नहीं है, लेकिन जैसे ही यह चलता है आप अपनी स्क्रिप्ट का पता लगा सकते हैं। set -xvजिस सेक्शन को आप ट्रेस करना चाहते हैं उससे पहले और सेक्शन के set +xvबाद लगाएं । set -xxtrace को सक्षम करता है, जो निष्पादित करने वाली प्रत्येक पंक्ति को दिखाएगा। set -vवर्बोज़ मोड को सक्षम करता है, जो उन लाइनों को भी दिखाएगा, जिनमें प्रभाव हो सकता है, लेकिन निष्पादित नहीं होते हैं, जैसे कि चर असाइनमेंट।

आप अपने ट्रेस को टाइमस्टैम्प भी कर सकते हैं। आपको एक टर्मिनल एमुलेटर की आवश्यकता होती है जो हर लाइन को टाइमस्टैम्प कर सके; केवल एक ही मुझे पता है कि यह रियलटर्म है , जो एक विंडोज प्रोग्राम है, लेकिन यह वाइन के साथ काम करेगा। तुम भी उपयोग करने में सक्षम हो सकता है grabserial, हालांकि मैं असली सीरियल बंदरगाहों के साथ छोड़कर कोशिश नहीं की है। आप पता लगा सकते हैं कि आपका शेल किस सीरियल डिवाइस का उपयोग कर रहा है ps -p $$(यदि यह नहीं है, तो यह manपता लगाने के लिए उपयोग करें कि अपने psआउटपुट में TTY कॉलम को कैसे शामिल किया जाए )।

इसके अलावा, स्टैक ओवरफ्लो पर शेल स्क्रिप्ट के लिए प्रदर्शन रूपरेखा उपकरण देखें ।


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पाई की गणना करता है और 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|✔) $
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.