2009-07-07 17 views
5

मै मैक ओएस एक्स (10.5.7, ऐप्पल जेडीके 1.6.0_06-बी06-57) के तहत चल रहे गणितीय-गहन अनुप्रयोग को प्रोफाइल करने के लिए यूकिट 8.0 का उपयोग कर रहा हूं, और कुछ अजीब देखा है सीपीयू प्रोफाइलिंग परिणामों में व्यवहार।जावा में देशी विधियों को प्रोफाइल करना - अजीब परिणाम

उदाहरण के लिए - मैंने नमूनाकरण का उपयोग करके एक प्रोफाइलिंग रन किया था, जिसमें बताया गया था कि एप्लिकेशन के 10 मिनट के रनटाइम का 40% StrictMath.atan विधि में खर्च किया गया था। मुझे यह परेशान पाया गया, लेकिन मैंने इसे अपने शब्द पर लिया और अतान को बेहद सरल बहुपद फिट के साथ बदलने में थोडा समय बिताया।

जब मैं फिर से एप्लिकेशन चलाता था, तो यह लगभग उसी समय (लगभग 10 मिनट) के बराबर होता था - लेकिन मेरे एतान प्रतिस्थापन प्रोफाइलिंग परिणामों में कहीं भी दिखाई नहीं देता था। इसके बजाए, अन्य प्रमुख हॉटस्पॉट के रनटाइम प्रतिशत बस इसके लिए तैयार हो गए।

संक्षेप में:

परिणामों StrictMath.atan (देशी विधि)
कुल क्रम के साथ: 10 मिनट
विधि 1: 20%
विधि 2: 20%
विधि 3: 20%
StrictMath.atan: 40% सरलीकृत, शुद्ध जावा के साथ

परिणामों atan
कुल क्रम: 10 minu ट
विधि 1: 33%
विधि 2: 33%
विधि 3: 33%

(तरीके 1,2,3 किसी भी atan कॉल प्रदर्शन नहीं करते)

किसी भी विचार क्या है इस व्यवहार के साथ? मुझे ईजे-टेक्नोलॉजीज के जेपीरोफाइलर का उपयोग करके एक ही परिणाम मिला। ऐसा लगता है कि जेडीके प्रोफाइलिंग एपीआई मूल तरीकों के लिए गलत परिणामों की रिपोर्ट करता है, कम से कम ओएस एक्स

+0

मुझे आश्चर्य नहीं होगा अगर 'एटान' एक आंतरिक तरीका था - विधि को कॉल करने के बजाय, समकक्ष मशीन कोड इनलाइन इंजेक्शन दिया जाता है। –

+0

मैक ओएस एक्स 10.7 (और पहले के संस्करणों) पर स्ट्रिक्टैथ में विभिन्न विधियों के साथ-साथ मैंने इसका अनुभव किया है। –

+0

तो क्या इस समस्या का कोई समाधान है? – ziggystar

उत्तर

3

यह नमूने लेने के असंगतताओं के कारण हो सकता है। तो उदाहरण के लिए, यदि कोई विधि उचित समय का उपयोग करती है, लेकिन निष्पादित करने में बहुत लंबा समय नहीं लगता है, तो नमूनाकरण को याद करने के लिए यह संभव है। साथ ही, मुझे लगता है कि कचरा संग्रह नमूना के दौरान कभी नहीं होता है, लेकिन अगर कुछ कोड बहुत सारे कचरे के संग्रह का कारण बनता है तो यह नमूना में दिखाई देने के बिना मंदी में बहुत योगदान दे सकता है।

इसी तरह की स्थिति में मुझे दो बार दौड़ने में बहुत मदद मिली है, एक बार ट्रेसिंग के साथ-साथ एक साथ नमूनाकरण के साथ। यदि दोनों में एक विधि दिखाई देती है तो शायद यह बहुत सी सीपीयू का उपयोग कर रही है, अन्यथा यह नमूना प्रक्रिया का एक आर्टिफैक्ट हो सकता है।

0

मुझे लगता है कि आपकीकिट उप-विधियों को कॉल करने की लागत को अत्यधिक अतिरंजित करती है (इसकी लॉगिंग विधि के कारण, मुझे लगता है)। यदि आप केवल सलाह देते हैं कि प्रोफ़ाइल आपको देता है तो आप केवल वास्तविक लाभ के साथ विलय करने वाले कार्यों को समाप्त कर देंगे क्योंकि हॉटस्पॉट आमतौर पर इसके लिए उत्कृष्टता से काम करता है।

इसलिए, मैं अत्यधिक बेहतर विचार प्राप्त करने के लिए बैच को पूरी तरह से फायदेमंद परीक्षण करने की सलाह देता हूं कि परिवर्तन वास्तव में फायदेमंद हैं (यह स्पष्ट प्रतीत हो सकता है लेकिन इससे मुझे कुछ विकास का समय लगता है)।

0

चूंकि आप मैक का उपयोग कर रहे हैं, तो आप Apple's Shark profiler (एडीसी से मुफ्त डाउनलोड) का प्रयास कर सकते हैं जिसमें जावा समर्थन है और ऐप्पल के प्रदर्शन समूह ने टूल में उचित समय दिया है।

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

0

आप तीन विधियों में पारित पैरामीटर को देखना चाह सकते हैं। ऐसा हो सकता है कि समय वापसी मूल्यों या उन तरीकों से उत्पन्न हो रहा है जो बहुत सारी अस्थायी वस्तुओं का निर्माण कर रहे हैं।

-1

प्रोफाइलर ऐसा हो सकते हैं।

This is the method I use.

काम करता है हर बार।

And this is why.

+0

यह बताने की तरह है कि यह नमूना प्रोफाइलर से अलग परिणामों की ओर क्यों जाता है जो इस प्रक्रिया को स्वचालित करता है? – ziggystar

+0

@ ज़िगगीस्टार: कुछ नमूना प्रोफाइलर्स प्रक्रिया के आधा स्वचालित, अर्थात् जो लोग पूरे ढेर का नमूना देते हैं, दीवार घड़ी (सीपीयू नहीं) समय पर। प्रक्रिया का आधा हिस्सा स्वचालित नहीं होता है, जो आप ठीक कर सकते हैं प्रदर्शन समस्याओं की खोज है। यदि किसी कथन या फ़ंक्शन में छोटे समावेशी% हैं, तो समस्या कहीं और है, लेकिन इससे समस्या कम नहीं होती है, जहां समस्या बहुत अधिक है। बस यह जानकर कि कोड, फ़ंक्शन, या "पथ" की एक पंक्ति "गर्म" आपको बहुत कुछ नहीं बताती है। यदि आप विशिष्ट प्रतिनिधि नमूनों की पूरी तरह से जांच कर सकते हैं तो यह अधिक खुलासा है। ... –

+0

@ziggystar: ... इसके परिणामस्वरूप यह अलग-अलग परिणाम यह है कि आपको स्पीडअप मिलते हैं जो आपको एक बहुत अच्छे प्रोफाइलर के साथ नहीं मिलेंगे। जब आप उन्हें ठीक करते हैं और प्रक्रिया को दोहराते हैं, तो पहले की समस्याएं पहले बड़ी थीं क्योंकि कार्यक्रम कम समय लेता है। तो, एक-एक करके, आप इन्हें ठीक करते हैं, और मिश्रित गति आश्चर्यजनक हो सकता है। आप कभी प्रोफाइलर के साथ कितनी गति प्राप्त करते थे? अगर उत्तर 40% से अधिक है तो यह मुझे आश्चर्यचकित करेगा। –

0

यह ध्यान देने योग्य है कि जावा तरीकों अगर वे काफी छोटे हैं inlined किया जा सकता है, फिर भी देशी तरीकों विभिन्न नियमों के तहत inlined कर रहे हैं लायक। यदि कोई विधि रेखांकित की गई है तो यह प्रोफाइलर में दिखाई नहीं दे रहा है (निश्चित रूप से आपकी किट नहीं है)