tools - xdebug php ini
KCachegrind confusiĆ³n interpretaciĆ³n (2)
Estoy tratando de entender los valores que se muestran en Kcachegrind en el panel izquierdo
Tengo Incl. (que he leído en el manual es inclusivo), Self, llamado una función
Ahora estoy analizando este archivo cachegrind y tengo
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
y la lista continúa ...
Pero éste es mi problema.
Creo que el elemento-> cerrar es mi cuello de botella, pero lo que no entiendo es cómo tiene 83.38 de Inclusive y luego 0.07 de Self y el comando mysql_query tiene el mismo en ambos.
¿Qué significa el "yo" aquí?
Además, ¿cómo se relacionan estos porcentajes entre sí? No entiendo cómo el item-> close toma el 83% y mysql_query toma el 78%
Gracias
"self" significa el tiempo que toma esa función, pero no de las funciones que llama. Si "sí mismo" es bajo y "incl." es alto, entonces el mejor lugar para optimizar es probablemente uno de los niños (por ejemplo, funciones llamadas). En este caso, parece que la consulta mysql toma la mayor parte del tiempo, por lo que probablemente desee optimizar la consulta (si es posible). La razón por la cual mysql_qeury
tiene "self" == "incl." es que el generador de perfiles no puede ver la función, ya que está haciendo su trabajo fuera del tiempo de ejecución php (por ejemplo, en la biblioteca del cliente mysql)
Debo agregar que las llamadas 10067 a mysql_query
parecen sospechosas. Una consulta de base de datos es una operación muy costosa. ¿Estás seguro de que no puedes reducir el número de consultas de alguna manera?
Editar:
Puedo probar. ¿Pero qué hay del Incl.? ¿Cómo es 80 al final y luego 70 en la consulta de MySQL? ¿Cómo se relaciona eso con el porcentaje total que debería ser 100%?
Los números no necesitan sumarse. Lo que estás viendo es una lista ordenada del tiempo del todo que toman estas funciones. No es un gráfico de llamadas (aunque a menudo sucederá que imita eso de alguna manera).
Supongamos el siguiente código:
function fn1() {
sleep(1);
fn2();
}
function fn2() {
sleep(98);
}
function fn3() {
sleep(1);
}
fn1();
fn3();
Que podría generar el siguiente resultado:
name | incl. | self
main | 100% | 0%
fn1 | 99% | 1%
fn2 | 98% | 98%
fn3 | 1% | 1%
Cuando ordena la lista por "incl.", Está mirando las funciones que son lentas en conjunto . En otras palabras, aquellos que puntúan alto aquí, no son necesariamente lentos, pero llaman a otras funciones que sí lo son. Si una función tiene un puntaje alto en "incl." y tiene muchas llamadas, debe buscar reducir la cantidad de llamadas a esta función o dejar que la función guarde su resultado (solo funciona si se trata de una consulta, no de una acción).
Cuando clasifique por "sí mismo", verá las llamadas reales que ocupan más tiempo. Estas son las funciones que te gustaría ajustar. En la mayoría de los scripts PHP, encontrarás que mysql_query
domina este campo. Si tiene muchas llamadas, nuevamente intente reducirlas o almacenarlas en caché. Si tiene pocas llamadas, entonces probablemente necesite optimizar la consulta sql. El depurador de PHP no puede ayudarte con esto. En su lugar, encuentre la consulta real y ejecute una explain
en la consola mysql. Eso es todo un capítulo en sí mismo.
Auto significa el tiempo dedicado a la función excluyendo cualquier función que llame.
Por ejemplo:
function foo()
{
bar();
}
function bar
{
sleep(1);
}
foo();
Esto te daría:
Incl Self Func
1 0 foo
1 0 bar
1 1 sleep <- Here''s the bottleneck!