2008-09-18 31 views
9

मैं जावा में एक साधारण चेकर्स गेम लिख रहा हूं। जब मैं बोर्ड पर माउस करता हूं तो मेरे प्रोसेसर रैंप 50% तक (कोर पर 100%)।जावा: मैं कैसे देख सकता हूं कि मेरे कोड के कौन से हिस्से सबसे अधिक चल रहे हैं? (प्रोफाइलिंग)

मैं यह जानना चाहता हूं कि मेरे कोड का क्या हिस्सा (इसकी गलती मानना) इस दौरान निष्पादित हो रहा है।

मैंने डीबगिंग करने का प्रयास किया है, लेकिन इस मामले में चरण-दर-डीबगिंग बहुत अच्छी तरह से काम नहीं करती है।

क्या कोई ऐसा उपकरण है जो मुझे बता सकता है कि मेरी समस्या कहां है? मैं वर्तमान में ग्रहण का उपयोग कर रहा हूँ।

+0

धन्यवाद दोस्तों! मैं eclipse btw – jjnguy

उत्तर

12

इसे "प्रोफाइलिंग" कहा जाता है। आपका आईडीई शायद एक के साथ आता है: Open Source Profilers in Java देखें।

2

प्रोफाइलिंग? मुझे नहीं पता कि आप किस आईडीई का उपयोग कर रहे हैं, लेकिन Eclipse has a decent proflier और java-source पर कुछ ओपन-सोर्स प्रोफाइलर्स की एक सूची भी है। जहाँ आपके कोड बहुत समय खर्च कर रहा है यह बहुत जल्दी से आप को बताना चाहिए -

+0

का उपयोग कर रहा हूं क्या आप टीपीटीपी का उपयोग करने पर कुछ सुझाव लिख सकते हैं? वह सोना होगा! –

1

1) यह तुम्हारी गलती :)

2) यदि आप ग्रहण या NetBeans उपयोग कर रहे हैं, की रूपरेखा सुविधाओं का उपयोग करने की कोशिश है।

3) विफल होने पर, कंसोल आउटपुट जोड़ें जहां आपको लगता है कि आंतरिक लूप है - आपको इसे जल्दी से ढूंढने में सक्षम होना चाहिए।

1

हां, ऐसे उपकरण हैं: आपको कोड को प्रोफाइल करना होगा। आप या तो ग्रहण में TPTP आज़मा सकते हैं या शायद JProfiler आज़मा सकते हैं। इससे आपको यह देखने दिया जाएगा कि क्या कहा जा रहा है और कितनी बार।

1

एक प्रोफाइलर का उपयोग करें। वहां कई हैं। यहां एक सूची है: http://java-source.net/open-source/profilers। उदाहरण के लिए आप JIP, जावा कोडेड प्रोफाइलर का उपयोग कर सकते हैं।

0

का उपयोग करें या तुम्हारा के कुछ सामान्य घटकों के लिए JUnit परीक्षण मामलों और एक कोड कवरेज उपकरण का उपयोग। यदि ऐसे घटक हैं जो अन्य घटकों को कॉल करते हैं, तो आप जल्दी से उन लोगों को कई बार निष्पादित करेंगे।

मैं क्लून को ज्यूनिट परीक्षण मामलों के साथ उपयोग करता हूं, लेकिन ओपन-सोर्स के लिए, मैंने सुना है कि ईएमएमए बहुत अच्छा है।

2

संक्षेप में, profilers आपको बताएगा कि आपके प्रोग्राम का कौन सा हिस्सा कहलाता है।

मैं अपने कार्यक्रमों को बहुत अधिक प्रोफाइल नहीं करता हूं, इसलिए मेरे पास बहुत अधिक अनुभव नहीं है, लेकिन जब मैंने इसका परीक्षण किया था तो मैंने NetBeans IDE प्रोफाइलर के साथ खेला है। (मैं आमतौर पर एक्लिप्स का भी उपयोग करता हूं। मैं ग्रहण में प्रोफाइलिंग विशेषताओं को भी देखूंगा।)

नेटबीन प्रोफाइलर आपको बताएगा कि कौन सा धागा कितना समय तक निष्पादित कर रहा था, और कौन से तरीकों को लंबे समय तक बुलाया गया है, और कौन देगा आप ग्राफ को बार दिखाने के लिए कहते हैं कि प्रत्येक विधि ने कितना समय लिया है। यह आपको एक संकेत दे सकता है कि कौन सी विधि समस्याएं पैदा कर रही है। आप Java profiler पर एक नज़र डाल सकते हैं कि यदि आप उत्सुक हैं तो NetBeans IDE प्रदान करता है।

प्रोफाइलिंग एक ऐसी तकनीक है जिसका प्रयोग आमतौर पर एक प्रोग्राम के कौन से हिस्सों को निष्पादन के समय को मापने के लिए किया जाता है, जिसका उपयोग यह मूल्यांकन करने के लिए किया जा सकता है कि ऑप्टिमाइज़ेशन प्रदर्शन करने के लिए लाभकारी होगा या नहीं कार्यक्रम।

शुभकामनाएं!

1

यह आमतौर पर 'उच्च CPU' समस्या है।

उच्च CPU समस्याओं

के दो प्रकार के होते हैं

क) जहाँ धागे पर) एक कोर की 100% सीपीयू (यह आपके परिदृश्य है)

ख CPU उपयोग 'असामान्य रूप से उच्च' जब हम है उपयोग कर रहा है कुछ क्रियाएं निष्पादित करें। ऐसे मामलों में सीपीयू 100% नहीं हो सकता है लेकिन असामान्य रूप से उच्च होगा। आम तौर पर ऐसा तब होता है जब हमारे पास एक्सएमएल पार्सिंग, सीरियलाइजेशन डी-सीरियलाइजेशन इत्यादि जैसे कोड में सीपीयू गहन संचालन होता है।

केस (ए) विश्लेषण करना आसान है। जब आप 30 सेकंड अंतराल में 100% सीपीयू 5-6 थ्रेड डंप का अनुभव करते हैं। एक थ्रेड की तलाश करें जो सक्रिय है ("रननेबल" स्थिति में) और जो एक ही विधि के अंदर है (आप थ्रेड स्टैक की निगरानी करके इसका अनुमान लगा सकते हैं)। अधिकांश शायद यह है कि आप एक 'व्यस्त प्रतीक्षा' देखेंगे (उदाहरण के लिए नीचे दिए गए कोड को देखने)

while(true){ 
    if(status) break; 
    // Thread.sleep(60000); // such a statement would have avoided busy wait 
} 

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

मैं हमेशा पहले थ्रेड डंप के साथ प्रयास करता हूं। प्रोफाइलर केवल अंतिम उपाय होंगे। 80% मामलों में हम थ्रेड डंप का उपयोग करने में पहचान पाएंगे।

1

Clover प्रत्येक पंक्ति और शाखा के लिए हिट गणना दिखाने वाली एक अच्छी रिपोर्ट देगी। उदाहरण के लिए, this line को 7 बार निष्पादित किया गया था।

ग्रहण, मेवेन, चींटी और आईडीईए के लिए प्लगइन्स उपलब्ध हैं। यह free for open source है, या आप 30 day evaluation license प्राप्त कर सकते हैं।

1

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

यह टूल आपको बताएगा कि कौन से तरीके सभी प्रोसेसर समय का उपयोग कर रहे हैं।

वहां बहुत सारे शक्तिशाली उपकरण हैं, लेकिन पहले एक निःशुल्क खेल है। फिर, जब आप पढ़ते हैं कि वहां कौन सी अन्य सुविधाएं उपलब्ध हैं, तो आपको इस बारे में एक दिलचस्प लगेगा कि वे आपकी मदद कैसे कर सकते हैं।

0

सिंगल-थ्रेडेड कोड में, मुझे इस तरह के कुछ बयान जोड़ना पड़ता है: System.out.println ("ए:" + System.currentTimeMillis()); एक प्रोफाइलर का उपयोग करने के रूप में सरल और प्रभावी है। आप समस्या के कारण कोड के हिस्से को जल्द ही संकीर्ण कर सकते हैं।

+0

इसकी बहु थ्रेडेड। लेकिन मुझे लगता है कि एक और समय के लिए टिप। – jjnguy

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

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