क्या emacs में शेल कमांड पर अवरुद्ध समय की मात्रा को प्रोफाइल करने का कोई तरीका है? निम्नलिखित कार्यक्रम पर विचार करें:

(profiler-start 'cpu)
(shell-command "sleep 3")
(profiler-report)
(profiler-stop)

प्रोफाइलर रिपोर्ट कुछ इस तरह दिखेगी:

- command-execute                                                 371  95%
 - call-interactively                                             371  95%
  - funcall-interactively                                         329  84%
   - execute-extended-command                                     175  44%
    - execute-extended-command--shorter                           157  40%
     - completion-try-completion                                  149  38%
      - completion--nth-completion                                149  38%
       - completion--some                                         143  36%
        - #<compiled 0x438307f1>                                  143  36%
         - completion-pcm-try-completion                          102  26%
          - completion-pcm--find-all-completions                   98  25%
             completion-pcm--all-completions                       98  25%
          + completion-pcm--merge-try                               4   1%
           completion-basic-try-completion                         41  10%
    + sit-for                                                      16   4%
   - eval-expression                                              154  39%
    - eval                                                        154  39%
     - profiler-start                                             154  39%
      - debug                                                     154  39%
       - recursive-edit                                           141  36%
        - command-execute                                         114  29%
         - call-interactively                                     114  29%
          - byte-code                                             107  27%
           + read--expression                                      64  16%
           + read-extended-command                                 43  11%
          + funcall-interactively                                   7   1%
  + byte-code                                                      42  10%
+ ...                                                              19   4%

जैसा कि आप देख सकते हैं कि बिताया गया समय कमोबेश समान रूप से वितरित है। मुझे आउटपुट देखने में दिलचस्पी है जो मुझे बताता है कि मैं प्रोग्राम के महत्वपूर्ण हिस्से को शेल-कमांड sleep 3 पर ब्लॉक करने में खर्च कर रहा हूं, क्या यह किसी तरह संभव है? मुझे पता है कि sleep 3 मेरे सीपीयू पर भारी नहीं है - लेकिन मैं यह पता लगाने की कोशिश कर रहा हूं कि magit से कौन से शेल कमांड बुलाए गए हैं, जिसमें इतना समय लग रहा है - इसलिए मुझे भी दिलचस्पी होगी सामान में जो आईओ-बाध्य है।

8
fredefox 21 मई 2019, 12:16

1 उत्तर

सबसे बढ़िया उत्तर

ध्यान दें कि profiler.el एक नमूना प्रोफाइलर है। यदि आप वॉल टाइम में रुचि रखते हैं, तो आप elp.el जैसे इंस्ट्रूमेंटिंग प्रोफाइलर को आजमा सकते हैं।

आपके मामले में आप M-x elp-instrument-package RET magit RET का उपयोग करके magit लिख सकते हैं। अपने मैगिट कमांड को चलाने के बाद आप M-x elp-results RET का उपयोग करके परिणामों पर एक नज़र डाल सकते हैं।

magit के लिए आप शायद पाएंगे कि फ़ंक्शन magit-process-file में बहुत समय लग रहा है। विशिष्ट फ़ंक्शन कॉल की और जांच करने के लिए आप बस उस या किसी अन्य फ़ंक्शन को एक सलाह फ़ंक्शन जोड़कर रनटाइम को फ़ंक्शन के तर्कों के साथ संदेश बफर में प्रत्येक व्यक्तिगत फ़ंक्शन कॉल के लिए निम्नानुसार जोड़ सकते हैं।

(defun log-function-time (f &rest args)
  (let ((time-start (current-time)))
    (prog1
        (apply f args)
      (message "%s seconds used in (magit-process-file %s)"
               (time-to-seconds (time-subtract (current-time) time-start))
               args))))

(advice-add 'magit-process-file :around 'log-function-time)
4
martin_joerg 31 मई 2019, 15:43