2009-07-07 10 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

「自己」という機能で撮影した時間を意味どのようにそれを得ることはありません。 「自己」が低く、「含む」の場合最適化する最適な場所は、おそらく子供の1人(例えば、関数と呼ばれる)にあります。この場合、mysql-queryにはほとんどの時間がかかるように見えるので、可能であればクエリを最適化することをお勧めします。 mysql_qeuryに "self" == "incl。"がある理由は、プロファイラがphp-runtime(例えば、mysqlクライアントライブラリの中にある)の外で作業を行っているので、プロファイラが関数を見ることができないということです。mysql_queryは1006の呼び出しを疑わしいとします。データベースクエリは非常に高価な操作です。何とかクエリの数を減らすことはできませんか?

編集:

私は試すことができます。しかし、Inclについてはどうですか?どのようにmysqlクエリでは80に近づいて70であり、それは100%になるべき合計パーセンテージにどのように関係しますか

数値は加算する必要はありません。あなたが見ているのは、これらの関数が取る全体の時間のソートされたリストです。コールグラフではありません(何とかそれを模倣することはよくありますが)。次のような出力を生成することがあります

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

は:

は、次のコード仮定「含」

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

あなたがして、リストを並べ替え、あなたが遅いの機能を見ていますは集計です。言い換えれば、ここで高い得点を持つものは必ずしも遅いわけではありませんが、他の機能を呼びます。関数が "incl"のスコアが高い場合には多くの呼び出しがあります。この関数の呼び出し回数を減らそうとするか、関数がその結果をキャッシュするようにする必要があります(アクションではなくクエリの場合のみ動作します)。

「セルフ」でソートすると、実際に多くの時間がかかるコールが表示されます。これらは、微調整したい機能です。ほとんどのPHPスクリプトでは、mysql_queryがこのフィールドを支配しています。通話が多い場合は、やり直してください。コールが少ない場合は、おそらくSQLクエリを最適化する必要があります。 PHPデバッガはこれを手助けすることはできません。代わりに、実際のクエリを見つけ、mysql-consoleでexplainを実行してください。それはそれ自体の全体的な章です。

+0

私は試すことができます。 しかし、Inclはどうですか?どうすればmysqlクエリで80回、それから70回になるのでしょうか?それは100%になるべき合計パーセンテージにどのように関係しますか – AntonioCS

+0

fn1()の中でfn1()を呼び出すのですか?これは無限ループを引き起こします – AntonioCS

+0

@Antonio:そうです、それはタイプミスです。私は今それを修正しました。 – 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!