2009-07-07 8 views
34

मैं मान बाएं पैनलKCachegrind व्याख्या भ्रम

मैं सहित राशि में Kcachegrind में दिखाया गया है समझने की कोशिश कर रहा हूँ। .. स्व, कहा जाता है एक समारोह

अब मैं इस cachegrind फ़ाइल का विश्लेषण कर रहा हूँ और मैं

Incl. ---- Self ---- Called ---- Function 

100.05 ---- 0.04 ---- (0) ---- {main} 

83.38 ---- 0.07 ---- 250 --- item->close 

78.85 ---- 78.85 ---- 10 067 ---- php::mysql_query 

है और सूची जारी है (जो मैं मैनुअल में पढ़ा समावेशी है),

लेकिन यहाँ है मेरी समस्या।

मुझे लगता है कि आइटम-> बंद मेरी बाधा है लेकिन मुझे समझ में नहीं आता है कि इसमें 83.38 समावेशी है और फिर 0.07 स्वयं और mysql_query कमांड दोनों में समान है।

'स्वयं' यहां क्या संकेत देता है?

यह प्रतिशत एक-दूसरे से कैसे संबंधित हैं? मैं समझ नहीं कैसे आइटम,> पास किसी भी कार्य करता है कि यह कॉल से 83% लेता है और mysql_query 78% लेता है

धन्यवाद

उत्तर

55

"स्व" समय है कि समारोह के द्वारा लिया गया है इसका मतलब है, लेकिन नहीं है। यदि "स्वयं" कम है और "सहित" उच्च है, तो अनुकूलित करने के लिए सबसे अच्छी जगह शायद बच्चों में से एक (उदाहरण के लिए कहा जाता है) में है। इस मामले में, ऐसा लगता है कि mysql-query अधिकतर समय लेता है, इसलिए आप शायद क्वेरी को अनुकूलित करना चाहते हैं (यदि संभव हो)। mysql_qeury का कारण "स्वयं" == "सहित" है। यह है कि प्रोफाइलर फ़ंक्शन में नहीं देख सकता है, क्योंकि यह php-runtime (जैसे। mysql क्लाइंट लाइब्रेरी में) के बाहर अपना काम कर रहा है

मैं जोड़ सकता हूं कि mysql_query पर 10067 कॉल शक्तिशाली संदिग्ध दिखते हैं। एक डेटाबेस क्वेरी एक बहुत महंगा ऑपरेशन है। क्या आप वाकई किसी भी तरह से प्रश्नों की संख्या को कम नहीं कर सकते हैं?

संपादित करें:

मैं कोशिश कर सकते हैं। लेकिन इसके बारे में क्या? यह 80 में बंद है और 70 में MySQL क्वेरी में यह कुल प्रतिशत से कैसे संबंधित है जो 100%

संख्याओं को जोड़ने की आवश्यकता नहीं है। आप जो देख रहे हैं, वह पूरे समय की एक क्रमबद्ध सूची है, ये कार्य लेते हैं। यह एक कॉल ग्राफ नहीं है (हालांकि यह किसी भी तरह नकल करने के लिए अक्सर होता है)।

function fn1() { 
    sleep(1); 
    fn2(); 
} 
function fn2() { 
    sleep(98); 
} 
function fn3() { 
    sleep(1); 
} 
fn1(); 
fn3(); 

निम्नलिखित में से कौन उत्पादन उत्पन्न हो सकता है::

निम्नलिखित कोड मान लें "। Incl"

name | incl. | self 
main | 100% | 0% 
fn1 | 99% | 1% 
fn2 | 98% | 98% 
fn3 | 1% | 1% 

आप द्वारा क्रमित है, तो आप कार्यों कि धीमी गति से कर रहे हैं पर देख रहे हैं कुल में । दूसरे शब्दों में, जो यहां उच्च स्कोर करते हैं, वे आवश्यक रूप से धीमे नहीं होते हैं, लेकिन वे अन्य कार्यों को कॉल करते हैं। यदि एक समारोह "सहित" पर उच्च स्कोर करता है और में कई कॉल हैं, आपको इस फ़ंक्शन में कॉल की संख्या को कम करने की कोशिश करनी चाहिए, या फ़ंक्शन को इसके परिणाम कैश करने दें (केवल एक कार्यवाही के बजाय यह एक क्वेरी है, तो काम करता है)।

जब आप "स्वयं" द्वारा क्रमबद्ध करते हैं, तो आप अधिकतर समय तक वास्तविक कॉल देखेंगे। ये वे कार्य हैं जिन्हें आप ठीक करना चाहते हैं। अधिकांश PHP स्क्रिप्ट में, आप पाएंगे कि mysql_query इस फ़ील्ड पर हावी है। यदि आपके पास कई कॉल हैं, तो फिर उन्हें कम करने या कैश करने का प्रयास करें। यदि आपके पास कुछ कॉल हैं, तो आपको शायद एसक्यूएल-क्वेरी को अनुकूलित करने की आवश्यकता है। PHP-डीबगर इस से आपकी सहायता नहीं कर सकता है। इसके बजाय, वास्तविक क्वेरी ढूंढें और mysql-console में explain चलाएं। यह अपने आप में एक पूरा अध्याय है।

+0

मैं कोशिश कर सकते हैं। लेकिन इनक्ल के बारे में क्या? यह 80 में बंद है और फिर 70 में MySQL क्वेरी में यह कुल प्रतिशत से कैसे संबंधित है जो 100% – AntonioCS

+0

होना चाहिए क्या आप fn1() के अंदर fn1() को कॉल करना चाहते थे? यह एक अनंत लूप – AntonioCS

+0

@ एंटोनियो का कारण बन जाएगा: आप सही हैं - वह एक टाइपो था। मैंने इसे अभी सही कर दिया है। – troelskn

12

स्वयं का मतलब है कि फ़ंक्शन में बिताए गए समय को किसी भी फ़ंक्शन को छोड़कर।

उदाहरण के लिए:

function foo() 
{ 
    bar(); 
} 

function bar 
{ 
    sleep(1); 
} 

foo(); 

यह आपको देना होगा:

Incl Self Func 
1  0  foo 
1  0  bar 
1  1  sleep <- Here's the bottleneck!