2009-02-20 17 views
42

मैं Emacs को बहुत अनुकूलित करता हूं। हाल ही में, मैंने अपने .emacs कॉन्फ़िगरेशन में कुछ जोड़ा जो स्पोरैडिक रूप से मेरे CPU को 100% पर चिपकाता है, लेकिन मुझे नहीं पता कि यह क्या है।Misbehaving Emacs Lisp प्रोफाइलिंग के लिए युक्तियाँ?

अगर मैं सी-जी प्रेस समय की एक गुच्छा है, अंत में मैं एक संदेश नीचे minibuffer मुझे पूछ अगर मैं ऑटो मेरी फ़ाइलों को बचाने के लिए चाहते हैं और फिर मैं पूरी तरह Emacs निरस्त करने के लिए चाहते हैं, तो मिल जाएगा। अगर मैं नहीं कहता और सी-जी दबाकर रखता हूं, तो आखिर में मैं सामान्य रूप से इमैक चलाने के लिए वापस आ सकता हूं। एक घंटा या बाद में यह फिर से होगा।

मैं, के बारे में जा रहा है कि मैं कर रहा हूँ विभिन्न चीजों को टिप्पणी मैं हाल ही में जोड़ दिया है, Emacs को पुन: प्रारंभ, अपराधी को कम करने की कोशिश कर रख सकता है, लेकिन यह धीमी गति से चल रहा है।

क्या कोई तरीका है कि मैं सीधे यह पता लगाने के लिए emacs प्रोफाइल कर सकता हूं कि कौन सी लिस्प फ़ंक्शन सीपीयू को घुमा रहा है?

उत्तर

48

debug-on-quitt पर सेट करने का सुझाव ताकि आप यह पता लगा सकें कि Emacs क्या अच्छा है। आप इसे एक नमूना के साथ नमूना प्रोफाइलिंग के रूप में सोच सकते हैं: अक्सर एक नमूना आपको चाहिए।


अद्यतन: संस्करण 24.3 के साथ शुरू, Emacs दो प्रोफाइलर शामिल हैं। profiler.el में एक (नया) नमूना प्रोफाइलर है, और elp.el में एक (पुराना) उपकरण प्रोफाइलर है।

नमूना प्रोफाइलर documented here है। यह उपयोग करने के लिए बहुत सरल है:

प्रोफाइलिंग शुरू करने के लिए, M-x profiler-start टाइप करें। आप प्रोसेसर उपयोग, स्मृति उपयोग, या दोनों द्वारा प्रोफ़ाइल का चयन कर सकते हैं। कुछ काम करने के बाद, प्रोफ़ाइल के लिए चुने गए प्रत्येक संसाधन के लिए सारांश बफर प्रदर्शित करने के लिए M-x profiler-report टाइप करें। जब आप प्रोफाइलिंग समाप्त कर लेंगे, तो M-x profiler-stop टाइप करें।

यहाँ Perforce/Emacs integration कि मैं बनाए रखने के साथ एक cpu+mem प्रोफाइलर सत्र से कुछ उदाहरण उत्पादन है। where the CPU time and memory use is coming from पता लगाने के लिए मैंने शीर्षतम फ़ंक्शन (progn) का विस्तार किया है।

Function           Bytes % 
- progn          26,715,850 29% 
    - let          26,715,850 29% 
    - while         26,715,850 29% 
     - let         26,715,850 29% 
     - cond         26,715,850 29% 
      - insert        26,715,850 29% 
      + c-after-change     26,713,770 29% 
      + p4-file-revision-annotate-links  2,080 0% 
+ let           20,431,797 22% 
+ call-interactively       12,767,261 14% 
+ save-current-buffer       10,005,836 11% 
+ while           8,337,166 9% 
+ p4-annotate-internal       5,964,974 6% 
+ p4-annotate         2,821,034 3% 
+ let*           2,089,810 2% 

आप देख सकते हैं कि अपराधी c-after-change है, इसलिए के रूप में यद्यपि मैं locally binding inhibit-modification-hooks to t around this code द्वारा CPU समय और स्मृति का एक बहुत बचत हो सकती है यह लग रहा है।


आप Emacs Lisp प्रोफाइलर का भी उपयोग कर सकते हैं। यह अपेक्षाकृत कम दस्तावेज है: आपको विवरण के लिए elp.el में टिप्पणियां पढ़नी होंगी, लेकिन मूल रूप से आप elp-instrument-package चलाते हैं ताकि किसी दिए गए उपसर्ग के साथ सभी कार्यों के लिए प्रोफाइलिंग चालू हो और फिर elp-results परिणाम देखने के लिए।

यहाँ, M-x elp-instrument-package RET c- RET लिखने के बाद कुछ विशिष्ट उत्पादन है सी की 4000 लाइनों fontifying, और फिर elp-results चल रहा है (और कॉल गिनती से सॉर्ट करने के elp-sort-by-function का उपयोग कर): अपने विशेष मामले में

Function Name     Call Count Elapsed Time Average Time 
============================= ========== ============ ============ 
c-skip-comments-and-strings 107   0.0   0.0 
c-valid-offset     78   0.0   0.0 
c-set-offset     68   0.031   0.0004558823 
c-end-of-macro     52   0.0   0.0 
c-neutralize-CPP-line   52   0.0   0.0 
c-font-lock-invalid-string  20   0.0   0.0 
c-set-style-1     19   0.031   0.0016315789 
... 

प्रोफाइलर मदद नहीं करता है तत्काल, क्योंकि आप नहीं जानते कि कौन सा पैकेज गलती पर है। लेकिन अगर आप अनुमान लगा सकते हैं (या इसे सुनिश्चित करने के लिए debug-on-quit का उपयोग करें) तो प्रोफाइलर समस्या का निदान करने में आपकी सहायता कर सकता है।

5

यह नहीं है कडाई के साथ अपने प्रश्न का उत्तर है, लेकिन बजाय टिप्पणी बाहर और पुनः आरंभ बात कर रहे हैं, तो आप -q विकल्प के साथ Emacs शुरू कर सकते हैं, एक बफर में अपने .emacs लोड और मूल्यांकन अपराधी को ट्रैक करने के लिए प्रत्येक लिंग स्वयं को सीएक्स सी के साथ।

+0

अच्छा बिंदु, मैं eval अभिव्यक्ति हर समय करते हैं, लेकिन डिबगिंग के इस मोड hadn ' शुरू में मेरे लिए नहीं हुआ। – EnigmaCurry

+3

आप प्रत्येक लिंग को बदले में मूल्यांकन नहीं करना चाहते हैं (जब तक कि आपके पास बहुत कम न हो)। 'Eval-region' के साथ, एक बाइनरी खोज का प्रयोग करें। – Drew

8

क्या आपने कोशिश की है: Options->Enter debugger on Quit/C-g? (इस emacs22 पर है)

आप डिबग करने के लिए स्टार्ट-अप Emacs की जरूरत है: emacs -q --no-site-file उपयोग करते हैं, तो आपका .emacs (या site-start.el या जो कुछ भी), मेनू आइटम Options->Enter debugger on Quit/C-g, और फिर मेनू आइटम Emacs-Lisp->Evaluate buffer और C-g को सक्रिय यह प्रतीत होता है जब जमाने के लिए। ऐसा करने का एक आसान तरीका हो सकता है .........

6

डोप.एल के साथ आप स्टार्टअप पर लोड किए गए पूरे .emacs या एकाधिक elisp फ़ाइलों को प्रोफ़ाइल कर सकते हैं। इसे www.gnufans.net/~deego/pub/emacspub/lisp-mine/dope/

M-x dope-quick-start से थोड़ा परिचय ट्यूटोरियल दिखाएगा।

संपादित करें: मूल URL अब मृत है, लेकिन Git हब पर एक काम दर्पण है:
https://raw.github.com/emacsmirror/dope/master/dope.el

+0

डोप पैकेज के लिए धन्यवाद। मैं इस पैकेज का उपयोग कर एक सेकंड से भी कम समय में लोड करने के लिए अपने .emacs को पुन: कॉन्फ़िगर करने में सक्षम था। :) – Amjith

संबंधित मुद्दे