2012-02-19 14 views
7

क्या निर्धारित करता है मैंने विंग आईडीई (v.4.1.3) और कमोडो आईडीई (v.7.0.0) के साथ पायथन 3 डीबग करने का प्रयास किया है। जैसा कि, उम्मीद है कि डीबगर बहुत रन-टाइम ओवरहेड जोड़ता है। लेकिन मुझे आश्चर्य हुआ कि एक दूसरे के बीच डिबगर्स कितने अलग हो सकते हैं।डीबगर रन-टाइम प्रदर्शन

यहां एक ही कार्यक्रम के लिए रन-टाइम हैं। कोई breakpoints या कुछ और, किसी भी वास्तविक डिबगिंग के बिना सिर्फ एक नियमित रूप से चलाने के लिए:

  • अजगर दुभाषिया द्वारा निष्पादित: 26 सेकंड
  • डिबगर # द्वारा निष्पादित 1: 137 सेकंड
  • डिबगर # द्वारा निष्पादित 2: 1143 सेकंड

मैं डीबगर्स को अनाम # 1 और # 2 के रूप में संदर्भित करता हूं, ऐसा न हो कि यह उनमें से एक के लिए एक अनजान (और संभावित रूप से गुमराह) विज्ञापन बन जाए।

क्या डिबगर्स में से एक वास्तव में 8 गुना "तेज़" है?

या वहाँ कुछ डिजाइन व्यापार बंद है, जहां एक तेज डिबगर अधिक गति के लिए बदले में कुछ सुविधाओं, या सटीक, या मजबूती, या जो कुछ भी, देता है? यदि ऐसा है, तो मुझे उन विवरणों को जानना अच्छा लगेगा, चाहे विंग/कोमोडो विशेष रूप से, या सामान्य रूप से पायथन डीबगर्स के लिए। क्यों कार्यक्रम कार्यक्रम बी से एक तेजी से कारण डीबगिंग के डोमेन के लिए विशिष्ट नहीं हो सकता है

+0

शायद यह ब्रेकपॉइंट पर इंतजार कर रहा है? – yak

+0

@yak कोई ब्रेकपॉइंट्स नहीं। बस सीधे अंत तक चलाएं। – max

+0

वहां कई सुविधाएं नहीं हो सकती हैं। मुझे लगता है कि एक धीमा के रूप में बस 8 गुना है। लेकिन शायद आपको पता करने के लिए कोड का विश्लेषण और प्रोफाइल करना होगा। –

उत्तर

12

एक अनुकूलित पायथन डीबगर करना किसी अन्य सॉफ़्टवेयर के रूप में है: चीजें वास्तव में अलग-अलग प्रदर्शन-वार हो सकती हैं (मैं पाइडेव लेखक हूं और मैंने पीईडीवी डीबगर किया है, इसलिए, मैं इस पर टिप्पणी कर सकता हूं, लेकिन नहीं अन्य, इसलिए, मैं सिर्फ एक पायथन डीबगर को अनुकूलित करने के लिए थोड़ा सा समझाऊंगा - क्योंकि मैंने पीईडीवी डीबगर को अनुकूलित करने में काफी समय बिताया है - मैं वास्तव में अन्य कार्यान्वयन के बारे में बात नहीं करूंगा क्योंकि मुझे नहीं पता कि कैसे वे किया गया था - pdb के अलावा, लेकिन हालांकि यह बातें लापता चल रहे जब तक आप वास्तव में कोड निष्पादित कि शुरू करेंगे द्वारा अच्छी तरह से काम करता है pdb नहीं वास्तव में एक तेजी से डिबगर लागू होने के बाद यह एक ब्रेकपाइंट हिट और आप इसे माध्यम से कदम रख रहे हैं, अपने कोड का पता लगाना)।

विशेष रूप से, कोई भी 'बेवकूफ' डीबगर आपके प्रोग्राम को प्रत्येक फ्रेम में पाइथन ट्रेस को सक्षम करके और धीमा कर सकता है कि प्रत्येक पंक्ति निष्पादित करने के लिए ब्रेकपॉइंट मैच है या नहीं (यह मोटे तौर पर पीडीबी कैसे काम करता है: जब भी आप कोई संदर्भ दर्ज करते हैं यह इसका पता लगाएगा और प्रत्येक पंक्ति के लिए यह जांच करेगा कि ब्रेकपॉइंट इससे मेल खाता है या नहीं, इसलिए, मुझे विश्वास है कि कोई भी कार्यान्वयन जो तेजी से होने की अपेक्षा करता है वास्तव में इस पर भरोसा नहीं कर सकता है)।

मुझे पता है कि पीईडीवी डीबगर में कई अनुकूलन हैं ... प्रमुख एक निम्न है: जब डीबगर एक नया फ्रेम (यानी: फ़ंक्शन) में प्रवेश करता है तो यह जांच करेगा कि क्या कोई 'संभावित' ब्रेकपॉइंट है जो वहां मारा जा सकता है और वहां नहीं है, तो यह भी है कि समारोह (दूसरी ओर, जब एक ब्रेकप्वाइंट पर बाद में के बाद कार्यक्रम को क्रियान्वित करने है जोड़ा जाता है पर पता लगा नहीं होगा, यह जाने के लिए और सभी पिछले मान्यताओं पुनर्मूल्यांकन के लिए, के रूप में किसी भी वर्तमान फ्रेम हो सकते हैं होगा ब्रेकपॉइंट छोड़ना)। और अगर यह निर्धारित करता है कि कुछ फ्रेम का पता लगाया जाना चाहिए, यह, कि फ्रेम के लिए एक नया उदाहरण है, जिसमें वह सब है कि फ्रेम से संबंधित है कैशिंग के लिए जिम्मेदार (यह केवल अजगर 2.5 से वास्तव में संभव हो गया था हो जाएगा पैदा हो जाएगी, इसलिए जब अजगर 2.4 पर काम कर और इससे पहले, जब तक थ्रेडफ्रेम एक्सटेंशन स्थापित नहीं किया जाता है, तो डीबगर उस अनुकरण का प्रयास करेगा, जो इसे पायथन 2.4 पर काफी धीमा कर देगा)।

इसके अलावा, पीईडीवी डीबगर वर्तमान में साइथन का लाभ उठाता है, भले ही यह केवल सीपीथॉन तक ही सीमित है ... ज्योथन, आयरनपीथन और पीईपी इसका लाभ नहीं लेते हैं), इसलिए शुद्ध पायथन पर विचार करने के लिए कई अनुकूलन अभी भी किए गए हैं मोड (शुक्र है कि साइथन पाइथन के लिए काफी करीब है ताकि साइथन के साथ सीपीथॉन पर इसे तेजी से काम करने के लिए कुछ बदलावों की आवश्यकता हो)।

कुछ संबंधित PyDev डिबगर अनुकूलन विकास के बारे में पोस्ट:

http://pydev.blogspot.co.id/2017/03/pydev-560-released-faster-debugger.html

http://pydev.blogspot.co.id/2016/01/pydev-451-debug-faster.html

http://pydev.blogspot.com/2008/02/pydev-debugger-and-psyco-speedups.html

http://pydev.blogspot.com/2005/10/high-speed-debugger.html

फिर भी, जगह हमेशा कुछ भूमि के ऊपर जोड़ देगा में डिबगर के साथ चल रहा (यहां तक ​​कि डब्ल्यू मुर्गी भारी PyDev डिबगर के रूप में इस तरह के अनुकूलित), इसलिए, PyDev भी एक ही दृष्टिकोण है कि pdb में इस्तेमाल किया जा सकता प्रदान करता है: कोड में एक ब्रेकपाइंट जोड़ सकते हैं और यह केवल उस बिंदु पर पता करना शुरू कर देंगे (जो PyDev के दूरस्थ डीबगर सुविधा है) : http://pydev.org/manual_adv_remote_debugger.html

और तुम डिबगर समर्थन करने के लिए, यह भी धीमी हो सकते हैं सुविधाओं के आधार पर (जैसे: जब आप PyDev में पकड़े गए अपवादों के लिए ब्रेक को सक्षम करते हैं, तो प्रोग्राम धीमा निष्पादित करेगा क्योंकि इसे ठीक से तोड़ने के लिए और अधिक चीजों का पता लगाने की आवश्यकता होगी)।

+0

में डिबगर्स को लागू करने के मूलभूत सिद्धांतों का एक उत्कृष्ट परिचय है, यह एक सही उत्तर है - कभी-कभी मैं अपने कोड के लिए किसी विशेष ब्रेकपॉइंट तक पहुंचने के लिए उम्र (यहां तक ​​कि 3-4 ऑर्डर की परिमाण) का इंतजार करता हूं और उसका डेटा लोड करता हूं डिस्क (डीबगर का उपयोग करते समय मैं लगभग हमेशा छोटे सेट का परीक्षण करता हूं), लेकिन यहां मुझे एक समाधान मिला - बस एक फ़ंक्शन में ब्रेकपॉइंट डालें, न कि स्क्रिप्ट के शीर्ष स्तर पर और वॉयला! अब यह वास्तव में तेज़ है। वास्तव में एक उत्तर के लिए धन्यवाद। –

2

यह पूछ की तरह है।

मुझे लगता है कि अधिकांश ग्राफिकल डिबगर्स पाइथन मानक लाइब्रेरी में प्रदान किए गए pdb मॉड्यूल पर शीर्ष या फ्रंटेंड पर बनाए गए हैं (हालांकि सभी नहीं हैं)। प्रदर्शन अंतर ज्यादातर कार्यान्वयन विवरण और जीयूआई अद्यतन ओवरहेड के लिए उबाल जाएगा। अंतर कोड की कुछ परत में प्रत्यक्ष संदर्भ बनाम अनावश्यक गहरी प्रतियां करने के रूप में सरल हो सकता है।

आप डीबगर प्रदर्शन के बारे में चिंतित हैं, तो आप तेजी से चित्रमय डिबगर के साथ, छड़ी, जब तक यह कुछ सुविधा की जरूरत है संतोषजनक नहीं है चाहिए। आप फीचर मतभेदों के लिए पूछ रहे हैं; चूंकि यह मामला है, वे स्पष्ट रूप से वर्तमान में आपकी आवश्यकताओं की पूर्ति कर रहे हैं। एक डिबगर परिशुद्धता खोने या मजबूती का त्याग है

है, तो मैं इसे तुरंत ध्यान से छूट होगी।

  • अतिरिक्त काम या अनावश्यक चेक (डेवलपर कोड के अन्य भागों पर भरोसा नहीं करता है, या उनके बहुत सारी परतें या अतिरेक वास्तुकला कर रहे हैं) कर रहा: मैं मौका एक अनुमान है कि धीमी एक या तो है होगा।

  • कुछ कैश-असभ्य या अपमानजनक प्रतिनिधित्व का उपयोग करना या कोड को एल्गोरिदमिक रूप से तेज़ डीबगर के रूप में ट्यून या अनुकूलित नहीं किया है। सही डेटा संरचना पसंद और एल्गोरिदमिक अनुकूलन अंतर के परिमाण के आदेश कर सकते हैं। कम-स्तरीय अनुकूलन (जैसे कि प्रकार, साइको, पायरेक्स) आदि का उपयोग करना .. आप एक अंतर की परिमाण का एक और क्रम बना सकते हैं। याद रखें कि पाइथन आपको लचीला और शक्तिशाली डिफ़ॉल्ट कंटेनर देता है जिसे आप हमेशा "भुगतान" देते हैं, भले ही आपको उनकी सभी कार्यक्षमता की आवश्यकता न हो।

मैं ने पाया है कि WinPDB काफी हल्के है, और के बाद से यह does not मुझे एक IDE करने के लिए टाई, एक मैं आमतौर पर इस्तेमाल करते हैं, और काफी प्रभावी ढंग से दूरस्थ डीबगिंग का समर्थन करता है। आप pydev के साथ ग्रहण करने का प्रयास भी कर सकते हैं। एक और नया जो मैंने अभी खेलना शुरू कर दिया है Python Tools for Visual Studio है जो बहुत ही आशाजनक दिखता है।पाइथन विकी पर list of python debuggers भी है। दूसरों को एक कोशिश देने लायक हो सकता है।

क्यों एक अन्य की तुलना में तेजी है, वहाँ संभव कारकों में से एक भीड़ हैं। यदि आपके पास डीबगर के स्रोत तक पहुंच है, तो आप प्रदर्शन बाधाओं की पहचान करने के लिए डीबगर को स्वयं प्रोफ़ाइल कर सकते हैं। लेकिन यदि आप बस एक तेज डीबगर चाहते हैं जो सभी बुनियादी उपयोग मामलों को संभालता है, तो बस कुछ और प्रयास करें, और अपनी आवश्यकताओं को पूरा करने वाले सबसे तेज़ से चिपके रहें।

+0

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

+0

@ मैक्स नंबर, कार्यान्वयन के आधार पर, आपके पास बहुत अधिक ओवरहेड हो सकता है, जैसे स्टैक और वर्तमान स्टैक फ्रेम की स्थिति को मॉडल रखने या जांचने, जैसे ब्रेक आदि। यदि डीबगर कोड बनाया गया है एक उच्च अमूर्त स्तर, जब आप "धातु से दूर" मिलता है तो महत्वपूर्ण ओवरहेड हो सकता है। जैसा कि आप ऑप्टिमाइज़ेशन के साथ "धातु के करीब" प्राप्त करते हैं, उदा। कम एक्सटेंशन वाले ऑपरेटिंग सिस्टम और हार्डवेयर सुविधाओं का उपयोग करने वाले सी एक्सटेंशन का उपयोग करके, आप पोर्टेबिलिटी खो देते हैं (यानी यह शुद्ध पायथन नहीं होगा) –

+0

आप इस पुस्तक को देखना चाहते हैं: [ग्रे हैट पायथन] (http: // www। amazon.com/Gray-Hat-Python-Programming-Engineers/dp/1593271921); विशेष रूप से अध्याय 3, जो कि पाइथन –