39

左パネルの Kcachegrind に表示される値を理解しようとしています

私は含まれています。(私がマニュアルで読んだものは包括的です)、Self、Called an Function

今、この 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

そしてリストは続きます..

しかし、ここに私の問題があります。

item->close が私のボトルネックだと思いますが、理解できないのは、83.38 の Inclusive と 0.07 の Self があり、mysql_query コマンドが両方で同じであることです。

ここでの「自己」とは何を意味するのでしょうか?

また、これらのパーセンテージは互いにどのように関連していますか? item->close が 83% かかり、mysql_query が 78% かかる方法がわかりません

ありがとう

4

2 に答える 2

65

「自己」とは、その関数にかかる時間を意味しますが、呼び出す関数からの時間ではありません。「自己」が低く「含む」場合 が高い場合、最適化するのに最適な場所は、おそらく子の1つ(関数と呼ばれるなど)です。この場合、mysql-queryはほとんどの時間かかるように見えるので、おそらくクエリを最適化する必要があります(可能な場合)。mysql_qeury"self"=="incl。"がある理由 プロファイラーはphp-runtimeの外で(たとえば、mysqlクライアントライブラリで)作業を行っているため、関数を見ることができません。

私は、10067の呼び出しが非常に疑わしいように見えることを付け加えるかもしれませんmysql_query。データベースクエリは非常にコストのかかる操作です。どういうわけかクエリの数を減らすことはできませんか?

編集:

私は試すことができます。しかし、含むのはどうですか?終了時に80、次にmysqlクエリで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%

リストを「含む」でソートすると、全体として遅い関数が表示されます。言い換えれば、ここで高得点を獲得したものは必ずしも遅いとは限りませんが、他の関数を呼び出します。関数のスコアが「含む」で高い場合。呼び出しが多い場合は、この関数の呼び出し数を減らすか、関数に結果をキャッシュさせることを検討する必要があります(アクションではなくクエリの場合にのみ機能します)。

「自分」で並べ替えると、最も時間がかかる実際の通話が表示されます。これらは、微調整したい機能です。mysql_queryほとんどのPHPスクリプトでは、これがこのフィールドを支配していることがわかります。呼び出しが多い場合は、もう一度それらを減らすか、キャッシュしてみてください。呼び出しが少ない場合は、おそらくsql-queryを最適化する必要があります。PHPデバッガーはこれを支援することはできません。代わりに、実際のクエリを見つけてexplain、mysql-consoleで実行します。それ自体が章全体です。

于 2009-07-07T15:52:32.127 に答える
15

Self は、関数が呼び出す関数を除いて、関数で費やされた時間を意味します。

例えば:

function foo()
{
    bar();
}

function bar
{
    sleep(1);
}

foo();

これにより、次のことが得られます。

Incl    Self   Func
1       0      foo
1       0      bar
1       1      sleep <- Here's the bottleneck!
于 2009-07-07T15:53:42.590 に答える