2010-12-08 11 views
38

जोशुआ ब्लोच की प्रस्तुति "प्रदर्शन चिंता" देखने के बाद, मैंने प्रस्तुति "Evaluating the Accuracy of Java Profilers" प्रस्तुति में सुझाए गए पेपर को पढ़ा। निष्कर्ष का हवाला देते हुए: क्योंकि वे संकेत मिलता समर्थक फाई ler अशुद्धता है कियदि प्रोफाइलर उत्तर नहीं है, तो हमारे पास अन्य विकल्प क्या हैं?

हमारे परिणाम परेशान कर रहे हैं व्यापक होने वाली हमारी सात मानक के अधिकांश में और दो उत्पादन JVM में - और उल्लेखनीय फाई नहीं कर सकते-सब राज्य के के चार -आप समर्थक गलत समर्थक का उत्पादन करते हैं। गलत प्रो फाई आसानी से एक प्रदर्शन विश्लेषक को ठंडे तरीकों को अनुकूलित करने में समय बिताने का कारण बन सकता है जिसका प्रदर्शन पर कम प्रभाव पड़ता है। हम बताते हैं कि एक सबूत अवधारणा-का-समर्थक फाई ler कि नमूने के लिए उपज अंक का उपयोग नहीं करता उपर्युक्त समस्याओं

कागज के निष्कर्ष यह है कि हम वास्तव में प्रोफाइलर का परिणाम विश्वास नहीं कर सकता से ग्रस्त नहीं है। लेकिन फिर, प्रोफाइलरों का उपयोग करने का विकल्प क्या है। क्या हमें वापस जाना चाहिए और अनुकूलन करने के लिए हमारी भावना का उपयोग करना चाहिए?

अद्यतन: कि चर्चा में याद किया जा रहा है एक बिंदु पर्यवेक्षक प्रभाव है। क्या हम एक प्रोफाइलर बना सकते हैं जो वास्तव में 'पर्यवेक्षक प्रभाव' -फ्री?

+2

+1। – daveb

उत्तर

40

ओह, आदमी, कहां से शुरू करना है?

सबसे पहले, मुझे आश्चर्य है कि यह खबर है। दूसरा, समस्या यह नहीं है कि प्रोफाइलर्स खराब हैं, यह है कि कुछ प्रोफाइलर्स खराब हैं। लेखकों ने एक ऐसा बनाया है, जिसे वे मूल्यांकन करते हैं, उनमें से कुछ गलतियों से बचकर, वे अच्छा महसूस करते हैं। त्रुटियां कुछ लगातार myths about performance profiling की वजह से आम हैं।

लेकिन चलिए सकारात्मक बनें। एक speedup के लिए अवसर खोजने के लिए चाहता है, यह वास्तव में बहुत सरल है:

  • सैम्पलिंग होना चाहिए कार्यक्रम के राज्य के साथ असहसंबद्ध
    इसका मतलब है कि वास्तव में यादृच्छिक समय पर हो रहा है, इस पर ध्यान दिए बिना कि कार्यक्रम I/O (उपयोगकर्ता इनपुट को छोड़कर), या जीसी में, या एक कड़े CPU लूप में, या जो भी हो।

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

  • रिपोर्टिंग चाहिए प्रतिशत (फ़ंक्शन द्वारा नहीं) दिखाएं।
    यदि कोई "हॉट" फ़ंक्शन पहचाना जाता है, तो उस समय के लिए कोड एकाउंटिंग की "हॉट" लाइनों के लिए अभी भी इसके अंदर शिकार करना होगा। नमूना में यह जानकारी है! इसे छुपा क्यों?

एक लगभग सार्वभौमिक गलती (है कि कागज शेयर) माप की सटीकता के साथ बहुत अधिक है, और स्थान की सटीकता के साथ पर्याप्त नहीं चिंतित होने की है। उदाहरण के लिए, यहां एक example of performance tuning है जिसमें प्रदर्शन समस्याओं की एक श्रृंखला की पहचान की गई और तय की गई, जिसके परिणामस्वरूप 43 गुना वृद्धि हुई। इसे ठीक करने से पहले प्रत्येक समस्या के आकार को सटीक रूप से जानना आवश्यक नहीं था, लेकिन इसके स्थान को जानने के लिए। प्रदर्शन ट्यूनिंग की एक घटना यह है कि समय को कम करके, एक समस्या को ठीक करना, शेष समस्याओं के प्रतिशत को बढ़ाता है, इसलिए उन्हें ढूंढना आसान होता है। जब तक कोई समस्या पाई जाती है और तय की जाती है, तो सभी समस्याओं को ढूंढने और ठीक करने के लक्ष्य की दिशा में प्रगति की जाती है। उन्हें आकार घटाने के क्रम में ठीक करने के लिए आवश्यक नहीं है, लेकिन उन्हें इंगित करना आवश्यक है।

माप की सांख्यिकीय सटीकता के विषय पर, अगर कॉल बिंदु स्टैक पर कुछ प्रतिशत एफ (जैसे 20%), और एन (जैसे 100) यादृच्छिक समय के नमूने लिया जाता है, तो नमूने की संख्या जो कॉल पॉइंट दिखाता है, एक द्विपक्षीय वितरण है, जिसका मतलब = एनएफ = 20, मानक विचलन = वर्ग (एनएफ (1-एफ)) = वर्ग (16) = 4. तो नमूने का प्रतिशत जो दिखाता है वह 20% +/- 4%। तो क्या यह सटीक है? वास्तव में नहीं, लेकिन समस्या मिली है? ठीक।

वास्तव में, बड़ी समस्या यह है कि प्रतिशत के मामले में, इसे कम करने के लिए कम नमूने की आवश्यकता होती है। उदाहरण के लिए, यदि 3 नमूने लिया जाता है, और उनमें से 2 पर एक कॉल पॉइंट दिखाई देता है, तो यह बहुत महंगा होने की संभावना है। (विशेष रूप से, यह बीटा वितरण का पालन करता है। यदि आप 4 वर्दी 0,1 यादृच्छिक संख्याएं उत्पन्न करते हैं, और उन्हें सॉर्ट करते हैं, तो तीसरे स्थान का वितरण उस कॉल पॉइंट के लिए लागत का वितरण होता है। इसका मतलब है (2 + 1)/(3 + 2) = 0.6, इसलिए उन नमूने दिए गए अपेक्षित बचत हैं।) निहित: और आपको प्राप्त होने वाले स्पीडअप कारक को अन्य वितरण, BetaPrime द्वारा नियंत्रित किया जाता है, और औसत औसत 4 है। तो यदि आप लेते हैं 3 नमूने, उनमें से 2 पर एक समस्या देखें, और उस समस्या को खत्म करें, औसतन आप कार्यक्रम को चार गुना तेज बना देंगे।

यह बहुत समय है कि हम प्रोग्रामर ने प्रोफाइलिंग के विषय पर हमारे सिर से कोबवे को उड़ा दिया।

अस्वीकरण - पेपर मेरे आलेख को संदर्भित करने में असफल रहा: डनलवे, "कॉल-स्टैक नमूना से प्राप्त निर्देश-स्तर लागत के साथ प्रदर्शन ट्यूनिंग", एसीएम सिग्प्लान नोटिस 42, 8 (अगस्त, 2007), पीपी 4-8। रोचक पढ़ने के लिए

+4

अच्छा जवाब। हालांकि मैं इस से पूरी तरह से सहमत नहीं हूं: ** किसी भी समस्या को पाया और तय किया गया है, सभी समस्याओं को खोजने और ठीक करने के लक्ष्य की दिशा में प्रगति की गई है **। सभी समस्याओं को हल नहीं किया जा सकता है, कभी-कभी प्रदर्शन की बाधाएं आवेदन की विशेषता के रूप में होती हैं, जिसका अर्थ है ** अन्य ** समस्याएं बढ़ाई नहीं जाएंगी। यह निश्चित रूप से एक बड़ी समस्या है। – nanda

+3

@ नंदा: यही कारण है कि मैंने कहा "और तय"। असल में, यदि ए, बी, सी, डी, और ई समस्याएं हैं, चाहे उनके रिश्तेदार आकारों के बावजूद, कोई भी आपको ढूंढने और ठीक करने के लिए, आदेश के बावजूद, दूसरों को बड़ा करता है। यदि कोई ऐसा है जिसे आप ठीक नहीं कर सकते हैं, तो यह नहीं है, लेकिन आप अभी भी दूसरों के लिए आगे बढ़ सकते हैं। –

+0

@ नंदा: यहां इस विषय पर गणित का एक दिलचस्प सा है: http://en.wikipedia.org/wiki/Rule_of_succession –

3

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

मुझे http://www.dynatrace.com/en/ के साथ अनुभव है और मैं आपको बता सकता हूं कि कम लटकते फल को खोजने में यह बहुत अच्छा है।

प्रोफाइलर किसी अन्य उपकरण की तरह हैं और उनके पास क्विर्क हैं लेकिन मैं किसी भी दिन किसी भी इंसान पर भरोसा करता हूं ताकि आपके ऐप में हॉट स्पॉट को देख सकें।

+1

+1 मैं मानता हूं कि आपके ऐप के सबसे खराब हिस्सों को आमतौर पर स्वीकार्य स्तर पर प्रदर्शन में सुधार करने में मदद मिलती है। अधिकतर प्रदर्शनों को तेजी से छोटे तरीकों को बनाकर प्राप्त नहीं किया जाता है, लेकिन ऑप्टिमाइज्ड हाई लेवल कोड की वजह से उन्हें कॉल नहीं किया जाता है। – Daniel

+1

@ डैनियल: पेपर से जुड़ा कागज एक दृढ़ मामला बनाता है कि प्रोफाइलर्स अक्सर कोड के सबसे धीमे हिस्सों को सही ढंग से नहीं पहचानते हैं। –

+0

@ माइकल: मेरी गलती! मैं लिखना चाहता था कि एक प्रोफाइलर के साथ भी, आपके ऐप के सबसे खराब हिस्सों को ढूंढना, आपको सबसे धीमे भागों में दिखाएगा। मैंने निष्कर्ष निकाला कि समस्याओं को हल करना यदि अक्सर कुछ मिलिस का मामला नहीं है, लेकिन अक्सर (शायद गलत तरीके से मापा गया) तरीकों को बुलाकर उन्हें प्राप्त किया जा सकता है। – Daniel

-1

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

आपका आवेदन वास्तव में धीमा हो जाएगा, लेकिन कम से कम आप की सटीक गणना होगी कि प्रत्येक विधि को कितनी बार बुलाया जाता है। यदि आप यह भी देखना चाहते हैं कि प्रत्येक विधि निष्पादित करने में कितनी देर लगती है, तो प्रत्येक विधि perf4j के चारों ओर लपेटें।

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

+0

-1 यह जेपीरोफाइलर (http://www.ej-technologies.com/products/jprofiler/overview.html) जैसे एजेंट इंस्ट्रूमेंटेशन के साथ अच्छे प्रोफाइलर्स से बेहतर नहीं है। – Daniel

+0

@ डैनियल: यदि आप किसी पर भरोसा नहीं करते हैं तो यह अभी भी एक प्रोफाइलर का उपयोग करने का एक वैकल्पिक दृष्टिकोण है। – darioo

+0

हां, लेकिन यदि आप प्रदर्शन परिणामों के बारे में प्रोफाइलरों पर भरोसा नहीं करते हैं (विधियों की कॉल यहां गिनती नहीं हुई हैं क्योंकि वे अभी भी विश्वसनीय रूप से प्रोफाइलर्स द्वारा मापा जाता है), तो perf4j के साथ संयोजन में AspectJ का उपयोग करने का दृष्टिकोण और भी भ्रामक है। – Daniel

8

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

कागज के निष्कर्ष यह है कि हम वास्तव में प्रोफाइलर का परिणाम विश्वास नहीं कर सकता है। लेकिन फिर, प्रोफाइलर का उपयोग करने के विकल्प विकल्प क्या है।

सं।पेपर का निष्कर्ष यह है कि मौजूदा प्रोफाइलरों के मापने के तरीकों में विशिष्ट दोष होते हैं। वे एक फिक्स का प्रस्ताव है। कागज काफी हाल ही में है। मैं उम्मीद करता हूं कि प्रोफाइलर्स अंततः इस फिक्स को लागू करें। तब तक, यहां तक ​​कि एक दोषपूर्ण प्रोफाइलर भी है "महसूस" से काफी बेहतर है।

+0

दूसरे कारण के बारे में: "पर्यवेक्षक प्रभाव"? किसी भी प्रोफाइलर को समस्या का सामना करना पड़ेगा और पर्यवेक्षक प्रभाव को हटाने का एकमात्र तरीका पर्यवेक्षक को हटाना है, यानी किसी भी प्रोफाइलर का उपयोग नहीं करना – nanda

+1

@ नंदा: लेकिन स्पष्ट रूप से, किसी भी प्रोफाइलर का उपयोग नहीं करना क्योंकि यह प्रदर्शन को प्रभावित करता है जैसे कि यह पाई नहीं खा रहा है क्योंकि यह चालू हो सकता है भयानक स्वाद के लिए बाहर।किसी भी अवलोकन के बिना हॉटस्पॉट के बारे में जानना संभव नहीं है (संभवतः संकलित उदाहरणों को छोड़कर जो उपयोगकर्ता इनपुट पर निर्भर नहीं हैं), लेकिन यदि आप यह जानने के बिना ऑप्टिमाइज़ करने का प्रयास करते हैं कि इसका महत्वपूर्ण प्रभाव कहां है, तो आपकी बाधाएं 80- 20 नियम – delnan

+0

"अंततः इस फिक्स को लागू करें" यह प्रगति होगी, लेकिन अभी भी अपर्याप्त होगी। मेरे विचार में, मापने से खोजने के लिए जोर को बदलने की जरूरत है। [यहां मेरा मतलब है कि एक बहुत छोटा स्पष्टीकरण है।] (Http://stackoverflow.com/questions/4468022/how-to-measure/4501805#4501805) –

-3

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

+0

डेटाबेस यहां लक्ष्य नहीं हैं और न ही सभी जावा ऐप डेटाबेस के साथ बातचीत करते हैं । –

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