আমি কীভাবে শেল স্ক্রিপ্ট প্রোফাইল করতে পারি?


10

আমার বেশ কয়েকটি প্রোগ্রাম রয়েছে যা আমি শেল স্ক্রিপ্টে চালাচ্ছি:

./myprogram1
./myprogram2
...

আমি জানি যে আমি উত্স কোড সম্পাদনা করে প্রতিটি স্বতন্ত্র প্রোগ্রামকে প্রোফাইল করতে পারি, তবে আমি জানতে চেয়েছিলাম যে স্ক্রিপ্টটি নিজেই প্রোফাইলের দ্বারা নির্বাহিত মোট সময়কে আমি মাপতে পারি এমন কোনও উপায় ছিল কিনা। এমন একটি টাইমার প্রোগ্রাম রয়েছে যা আমি এই উদ্দেশ্যে ব্যবহার করতে পারি? যদি তা হয় তবে এর পরিমাপ কতটা সঠিক?


হতে পারে এটি সহায়ক প্রোফাইলিং - একটি ব্যাশ শেল স্ক্রিপ্ট কিভাবে প্রোফাইল করবেন? - স্ট্যাক ওভারফ্লো -> stackoverflow.com/questions/5014823/...
মোহাম্মদ Efazati

উত্তর:


10

জন লিনের পরামর্শ অনুযায়ী সময় ব্যবহার করে শুরু করুন:

$ time ls test
test

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

আপনার স্ক্রিপ্টগুলি কী ইউনিক্সে চলছে তা আপনি বলবেন না তবে লিনাক্সের উপর স্ট্রেস, সোলারিস / এআইএক্স-এ ট্রুস করুন এবং আমি মনে করি এইচপি-ইউক্স-এ টাস্ক আপনাকে একটি প্রক্রিয়া কী করছে তা সম্পর্কে অনেক কিছু শিখতে দেয়। আমি একটি চমৎকার সংক্ষিপ্তসার পেতে স্ট্রেসের -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আউটপুটে টিটিওয়াই কলামটি অন্তর্ভুক্ত করতে হবে তা খুঁজে বের করুন )।

এছাড়াও, স্ট্যাক ওভারফ্লোতে শেল স্ক্রিপ্টগুলির জন্য পারফরম্যান্স প্রোফাইলিং সরঞ্জামগুলি দেখুন ।


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|✔) $
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.