2011-03-20 8 views
55

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

Thread ID: 81980260 
Total Time: 0.28 

    %total %self  total  self  wait  child   calls Name 
-------------------------------------------------------------------------------- 
         0.28  0.00  0.00  0.28    5/6  FrameParser#receive_data 
100.00% 0.00%  0.28  0.00  0.00  0.28    6  FrameParser#read_frames 
         0.28  0.00  0.00  0.28    4/4  ChatServerClient#receive_frame 
         0.00  0.00  0.00  0.00    5/47  Fixnum#+ 
         0.00  0.00  0.00  0.00    1/2  DebugServer#receive_frame 
         0.00  0.00  0.00  0.00   10/29  String#[] 
         0.00  0.00  0.00  0.00   10/21  <Class::Range>#allocate 
         0.00  0.00  0.00  0.00   10/71  String#index 
-------------------------------------------------------------------------------- 
100.00% 0.00%  0.28  0.00  0.00  0.28    5  FrameParser#receive_data 
         0.28  0.00  0.00  0.28    5/6  FrameParser#read_frames 
         0.00  0.00  0.00  0.00    5/16  ActiveSupport::CoreExtensions::String::OutputSafety#add_with_safety 
-------------------------------------------------------------------------------- 
         0.28  0.00  0.00  0.28    4/4  FrameParser#read_frames 
100.00% 0.00%  0.28  0.00  0.00  0.28    4  ChatServerClient#receive_frame 
         0.28  0.00  0.00  0.28    4/6  <Class::Lal>#safe_call 
-------------------------------------------------------------------------------- 
         0.00  0.00  0.00  0.00    1/6  <Class::Lal>#safe_call 
         0.00  0.00  0.00  0.00    1/6  DebugServer#receive_frame 
         0.28  0.00  0.00  0.28    4/6  ChatServerClient#receive_frame 
100.00% 0.00%  0.28  0.00  0.00  0.28    6  <Class::Lal>#safe_call 
         0.21  0.00  0.00  0.21    2/4  ChatUserFunction#register 
         0.06  0.00  0.00  0.06    2/2  ChatUserFunction#packet 
         0.01  0.00  0.00  0.01   4/130  Class#new 
         0.00  0.00  0.00  0.00    1/1  DebugServer#profile_stop 
         0.00  0.00  0.00  0.00    1/33  String#== 
         0.00  0.00  0.00  0.00    1/6  <Class::Lal>#safe_call 
         0.00  0.00  0.00  0.00    5/5  JSON#parse 
         0.00  0.00  0.00  0.00    5/8  <Class::Log>#log 
         0.00  0.00  0.00  0.00    5/5  String#strip! 
-------------------------------------------------------------------------------- 
+2

मैं यह इंगित करना चाहूंगा कि यदि आप डीबगर के तहत भागते हैं, इसे मैन्युअल रूप से बाधित करते हैं, और कॉल स्टैक को प्रदर्शित करते हैं, तो 4 बार, उन नमूने के औसत 3 पर यह होगा: 'read_frames -> get_frame -> safe_call -> रजिस्टर -> ... 'तो आपकी बाधा ध्यान के लिए आपके लिए चिल्ला रही होगी। यह [यह विधि] है (http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024)। शेष 25% समय अधिकतर है ... -> पैकेट -> ... '। बाकी सब कुछ मूल रूप से अप्रासंगिक है। –

+0

@ माइक, यह उपयोगी होगा अगर आपने यह निष्कर्ष निकाला कि आप इस निष्कर्ष को आकर्षित करने के लिए ग्राफ की व्याख्या कैसे करते हैं, क्योंकि मुझे लगता है कि यह प्रश्न यह है कि यह प्रश्न कैसे प्राप्त करने की कोशिश कर रहा है (इस आउटपुट की व्याख्या कैसे करें)। यह मेरे लिए उपयोगी होगा! –

+1

@ चार्ल्स: मैं "कुल" कॉलम देख रहा हूं, जो स्टैक पर बिताए गए समय की मात्रा है। लाइनों का पहला समूह 'read_frames' के बारे में है। इसका पूरा समय 'get_frame' को कॉल करने में बिताया जाता है। लाइनों का तीसरा गुच्छा 'get_frame' के बारे में है, जो अपना पूरा समय' safe_call' में बिताता है। चौथा गुच्छा कहता है कि 'safe_call' अपना अधिकांश समय' रजिस्टर 'में रखता है, फिर' पैकेट 'और' नया 'में थोड़ा सा खर्च करता है। (दूसरा गुच्छा कहता है 'get_data' हमेशा शीर्ष पर होता है।) –

उत्तर

61

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

  • FrameParser # read_frames के अंदर खर्च किया गया था की

    • 100% 6 बार बुलाया गया था।
    • read_frames के 6 कॉलों में से 5 फ्रेमपार्सर # get_data से आया था और यह निष्पादन समय का 100% था (यह read_frames लाइन के ऊपर की रेखा है)।
    • read_frames के नीचे की रेखाएं (लेकिन उस पहले अनुभाग के भीतर) विधि फ़्रेमपार्सर # read_frames कॉल के सभी तरीकों से हैं (आपको इसके बारे में पता होना चाहिए क्योंकि ऐसा लगता है कि यह आपका कोड है), इनमें से कितने तरीकों से कुल कॉल read_frames (ए/बी कॉल कॉलम) के लिए ज़िम्मेदार है, और उन कॉलों में कितना समय लगा। उनका आदेश दिया जाता है कि उनमें से किसने सबसे निष्पादन समय लिया। आपके मामले में, यह चैटसेवर क्लास पर get_frame विधि है।
    • फिर आप get_frames (2 डाउन और get_frame पर '100%' लाइन के साथ केंद्रित) पर ध्यान केंद्रित करने वाले अनुभाग पर देख सकते हैं और देख सकते हैं कि इसका प्रदर्शन कैसे टूटा हुआ है। प्रत्येक खंड एक ही तरीके से स्थापित होता है और आमतौर पर बाद की फ़ंक्शन कॉल जो अधिकतर समय लेती है वह अगले खंड का ध्यान केंद्रित करती है। रूबी-प्रोफेसर पूर्ण कॉल स्टैक के माध्यम से ऐसा करना जारी रखेगा। आप जितना चाहें उतना गहराई से जा सकते हैं जब तक आप उस बाधा को नहीं ढूंढ लेते जिसे आप हल करना चाहते हैं।
  • +4

    अधिक जानकारी के लिए आप रूबी-प्रोफेसर गिथब रेपो से स्पष्टीकरण के साथ इस उदाहरण को देख सकते हैं: https://github.com/rdp/ruby-prof/blob /master/examples/graph.txt – Florin

    +16

    रेपो स्थानांतरित हो गया, और वह लिंक अब https://github.com/ruby-prof/ruby-prof/blob/master/examples/graph.txt पर उपलब्ध है –

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