Беспорядок интерпретации KCachegrind

линт (очень похожий инструмент с открытым исходным кодом, названный шплинт )

35
задан mpen 17 February 2012 в 23:08
поделиться

2 ответа

"self" означает время, затраченное этой функцией, но не всеми функциями, которые она звонки. Если "self" низкий и "вкл." высокий, то оптимизировать лучше всего в одном из потомков (например, в вызываемых функциях). В этом случае похоже, что mysql-запрос занимает большую часть времени, поэтому вы, вероятно, захотите оптимизировать запрос (если возможно). Причина, по которой mysql_qeury имеет "self" == "incl." заключается в том, что профилировщик не может видеть функцию, поскольку он выполняет свою работу за пределами среды выполнения php (например, в клиентской библиотеке 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-отладчик в этом вам не поможет. Вместо, найти фактический запрос и запустить объяснение по нему в консоли mysql. Это отдельная глава.

59
ответ дан 27 November 2019 в 06:56
поделиться

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!
13
ответ дан 27 November 2019 в 06:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: