Путаница интерпретации KCachegrind

Я пытаюсь понять значения, показанные в Kcachegrind в левой панели

У меня есть Incl. (который я прочитал в руководстве, включительно), «Я», «Вызывается функция»

Теперь я анализирую этот файл 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%

благодаря

«self» означает время, затрачиваемое этой функцией, но не на любые функции, которые она вызывает. Если «Я» низкий и «вкл.» является высоким, то лучшим местом для оптимизации является, вероятно, один из детей (например, называемые функции). В этом случае, похоже, что mysql-запрос занимает большую часть времени, поэтому вы, вероятно, захотите оптимизировать запрос (если это возможно). Причина, по которой mysql_qeury имеет «я» == «вкл.» заключается в том, что профилировщик не может видеть в функции, поскольку он выполняет свою работу за пределами php-runtime (например, в клиентской библиотеке mysql)

Я могу добавить, что 10067 вызовов в mysql_query выглядит очень подозрительно. Запрос базы данных – очень дорогостоящая операция. Вы уверены, что каким-то образом вы не можете уменьшить количество запросов?

Редактировать:

Я могу попробовать. Но как насчет Incl. Как это 80 в конце, а затем 70 в запросе mysql, как это связано с общим процентом, который должен быть 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% 

Когда вы сортируете список «вкл.», Вы смотрите на функции, которые медленны в совокупности . Другими словами, те, кто высоко оценивают здесь, не обязательно медленны, но они называют другие функции. Если функция высоко оценивает значение «вкл.» и у вас много вызовов, вы должны искать попытку уменьшить количество вызовов этой функции или позволить кеше кеша его результата (работает только если это запрос, а не действие).

Когда вы сортируете по «себе», вы увидите фактические вызовы, которые занимают больше всего времени. Это те функции, которые вы хотите настроить. В большинстве скриптов PHP вы обнаружите, что в этом поле доминирует mysql_query . Если у вас много вызовов, попробуйте уменьшить их или кешировать. Если у вас мало вызовов, вам, вероятно, нужно оптимизировать sql-запрос. PHP-отладчик не может помочь вам в этом. Вместо этого найдите фактический запрос и запустите explain на нем в консоли mysql. Это целая глава сама по себе.

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!