2011-12-28 14 views
10

मैं जेपीरोफाइलर का उपयोग करके अपने आवेदन को प्रोफाइल कर रहा था और नतीजतन, "सीपीयू व्यूज़" सेक्शन में यह दिखाता है कि 40% से अधिक CPU समय Object.wait() पर खर्च किया जाता है। हालांकि जहां तक ​​मुझे Object.wait() पर पता है, सीपीयू प्रतीक्षा धागे को नहीं दिया गया है।सीपीयू उपयोग और ऑब्जेक्ट.वाइट

क्या कोई यह समझने में सहायता कर सकता है कि क्या हो रहा है और प्रोफाइलर क्यों दिखाता है कि यह सीपीयू Object.wait() पर खर्च किया गया है?

+0

क्या आप एकाधिक धागे का उपयोग कर रहे हैं या सिर्फ एक? क्या यह एक जीयूआई एप्लीकेशन या सर्वर है? – Kylar

+0

यह एक गैर-जीयूआई एप्लीकेशन है जिसमें कई धागे होते हैं - 40 से 60 के बीच - धागे। कुछ धागे नेटवर्क I/O की प्रतीक्षा कर रहे हैं और कुछ अन्य I/O का उपयोग प्राप्त अनुरोधों का जवाब देने का इंतजार कर रहे हैं। – Faramarz

उत्तर

6

प्रोफाइलर को पता नहीं है कि wait() में CPU निष्क्रिय है। प्रोफाइलर जानता है कि wait() दर्ज किया गया था, और कई मिलीसेकंड बाद में लौट आया। इसलिए, यदि उन मिलीसेकंड आपके निष्पादन समय का 40% लेते हैं, तो आपके पास यह है।

+0

प्रोफाइलर पर निर्भर करता है। उदाहरण के लिए, YourKit निश्चित रूप से CPU समय को मापने के लिए जानता है: http://www.yourkit.com/docs/10/help/times.jsp –

+0

@EliAcherkan हां, और मुझे यह भी पता नहीं है कि jprofiler को यह नहीं पता है; लेकिन कोई अन्य स्पष्टीकरण नहीं है। एकमात्र अन्य चीज जो मैं अनुमान लगा सकता हूं वह यह है कि यदि आपके पास एक तंग लूप में एक धागा है, तो 'प्रतीक्षा()' और एक और धागा एक तंग लूप में कुछ भी नहीं कर रहा है, लेकिन 'सूचित करें)' तो मुझे लगता है कि यह संभव है कि 'प्रतीक्षा करें() वास्तव में सीपीयू का एक बड़ा प्रतिशत उपभोग करेगा, न कि क्योंकि यह महंगा है और खुद ही महंगा है, लेकिन क्योंकि हम वास्तव में कुछ और नहीं कर रहे हैं। लेकिन यह बेहद असंभव है। –

2

40% क्या? आप निम्न कोड प्रोफ़ाइल मान लीजिए: आप CPU समय (नहीं दीवार-घड़ी समय) पर केवल देखें तो

for (i = 0; i < 1000; i++){ 
    sleep(1); 
} 

, लगभग सभी इसके बारे में sleep में होगा।

क्यों? चूंकि यह बहुत कम CPU समय का उपयोग कर रहा है, लेकिन CPU समय के का उपयोग कर, nealy का उपयोग करके sleep में प्रवेश करने और छोड़ने में व्यतीत किया जाता है।

बेशक, यदि आप दीवार घड़ी के समय को देखते हैं, तो इसमें से अधिक sleep में भी होगा।

किसी भी अवरुद्ध कॉल के लिए जाता है, जैसे wait

+0

सभी को धन्यवाद। मैं यह देखने के लिए कि यह मुझे क्या बताता है, मैं आपकी किट जैसे अन्य प्रोफाइलर की कोशिश करूंगा। – Faramarz

0

जेपीरोफाइलर विभिन्न थ्रेड राज्यों के बीच अंतर करता है। प्रतीक्षा विधि के लिए प्रदर्शित समय CPU दृश्यों के ऊपरी दाएं कोने में थ्रेड स्टेट चयनकर्ता पर निर्भर करता है। अधिक जानकारी के लिए कृपया http://blog.ej-technologies.com/2009/07/thread-states-in-cpu-profiling-views.html देखें।

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