2011-12-19 15 views
6

Estoy trabajando en un proyecto con Zend Framework 1.11, Doctrina 2, algunos Symfony 2 componenents y otras herramientas & bibliotecas.optimizar mi rendimiento

Estoy tratando de optimizar el rendimiento utilizando Xdebug & Webgrind.

ya he encontrado algunos cuellos de botella como el análisis Ini de configuración, etc .. y en caché que.

Ahora, acaba de darse cuenta de que la carga automática es la parte más costosa de mi solicitud:

Opl\Autoloader\ApcLoader->loadClass     274 31.36 43.86 
    Zend_Loader_PluginLoader->load       150 4.80 12.29 
    Zend_Loader_Autoloader->getClassAutoloaders   278 1.42 1.91 
    Zend_Controller_Router_Route_Regex->_getMappedValues 291 1.29 1.35 
    Doctrine\ORM\UnitOfWork->createEntity     85 1.24 3.18 

Como se puede ver que no estoy usando el valor por defecto Zend_Loader_Autoloader, estoy usando Opl que es, como Hasta ahora sé, más rápido que eso, estoy usando el classMapLoader con un caché APC, pero aún se ralentiza un poco en comparación con el resto de la aplicación.

¿Cómo podría optimizar eso?

Tengo alrededor de 250 clases cargadas, y parece que solo ~ 40 son lentas, otras muestran 0,00 como "Costo total de llamadas" pero otras están aumentando de 0,08 a 0,57 en la llamada requerida.

Por cierto, desde que utilicé el autocargador Opl, parece que en mi entorno de producción APC solo opera el caché de código de operación del archivo que son "requeridos manualmente", no los que son llamados por el autocargador.

Respuesta

4

Si refactorización su código no es una opción (caída de Zend Framework, Gota Doctrina, gota ...) Me gustaría primero optimizar en la compra de un mejor hardware. Eso optimizará automáticamente su código, porque el contexto del código simplemente se desplazó (esto no está optimizando exactamente el código, ya que el código no cambiará).

Si eso no se consideran una opción para crear usted mismo un sistema de construcción que se pueden pre-proceso de su base de código y crear una versión no-desarrollo de la misma para cortar el proceso de carga. Esto requiere el análisis de qué archivos se necesitan siempre y compilarlos en un formato optimizado para cargador que puede ser un solo archivo y/o mapas de cargador de clases estáticos.

Sin embargo, se sabe que Zend necesita cargar mucho en la memoria siempre. Incluso el uso de una memoria caché de PHP como APC podría traerle algo (considere precompilar con la secuencia de comandos de compilación anterior y optimizar las partes destacadas por sus métricas).

Si la estructura de su aplicación lo permite, también existe otra posibilidad: Mantenga toda la aplicación en la memoria entre las solicitudes. Eso se puede hacer con un servidor web PHP. Una vez hecho esto, el código solo debe cargarse una vez que el servidor se inicia y nunca será necesario volver a cargarlo. Esto solo funciona con su propia aplicación si es compatible con múltiples solicitudes. Una buena aplicación encapsulada especialmente con la lógica de solicitud puede adoptarse con bastante facilidad para eso. Una solución existente es appserver-in-php. Se sorprenderá de cuánto aumenta la velocidad en comparación con los beneficios que ya obtuvo de APC.

Quizás esto fue útil. Cualquier sugerencia adicional y más concreta es difícil de realizar, ya que no es posible ver su código en acción ni tener métricas detalladas sobre él. Acabas de pasar un fragmento sobre lo que está detrás de escena, así que es difícil decirte más concretamente.

+0

gracias su gran respuesta, de hecho mi problema es que migré de la aplicación pasada de moda con ZF1.7 y Zend_Db y su transacción rate (dado por asedio) devuelve algo así como 30/40/s donde el mío es solo 10, sin embargo hice mucha optimización como la optimización de consultas que reduce globalmente el tiempo de solicitud, pero estoy un poco decepcionado de tener esa tasa. Seguramente, la compra de hardware nuevo es una solución, y lo será, pero tampoco quiero que sea LA solución. Al mirar el autocargador, parece que Doctrine necesita más archivos que Zend Framework. – Trent

+0

Considere si realmente necesita un ORM en su aplicación. Si no lo hace, elimine la doctrina y simplemente use la * puerta de enlace de datos de tabla * o * la puerta de enlace de datos de fila * ofrece la biblioteca zend. O simplemente adhiérase a su propia abstracción db con el controlador mysql nativo de PHP en PDO. Si la base de datos es su cuello de botella, acerque su código y la base de datos en busca de rutas más cortas. Esto podría reducir algunas de las opciones de comodidad que ofrece ORM, pero será mucho más rápido y codificará su propia comodidad creando su propia función para buscar y enviar datos al almacenamiento de MySQL. – hakre

+1

Me gusta la sugerencia de dejar todo tipo de cosas (es decir, aligerar). No me importa la sugerencia de "comprar un mejor hardware. Eso optimizará automáticamente tu código". Es como decir que si el jinete está demasiado gordo, consigue un caballo más rápido. Los ingenieros que trabajan duro en los proveedores de chips hacen un trabajo increíble para darnos hardware cada vez más rápido. Me pregunto si saben que los programadores confían en eso, en lugar de sacar la grasa de su código. –

1

No me gusta lo que está sugiriendo hakre. Antes que nada, miraría si puedo abandonar el servidor web. Si es así, una buena alternativa es nginx o lighttpd. Comparado con el Apache son de este siglo y también la configuración es mucho más fácil.Acerca de la carga automática, realmente no lo sé, pero si los archivos de la clase son realmente grandes, ¿intentó instalar un disco RAM o usar un compresor php? En mi experiencia, un compresor PHP puede fijar significativamente el tiempo de ejecución (es decir, el tiempo de análisis).

3

Estoy tratando de optimizar el rendimiento utilizando Xdebug & Webgrind

bien, ya que estás en una posición de tener un mejor rendimiento en serio, podría estar abierto a un menor que popular, pero demostrable forma efectiva de hacerlo.

Funciona con cualquier idioma, siempre que haya un depurador que se pueda pausar, como Xdebug.

Aquí se describe in a nutshell. Here's one demonstration of its effectiveness. Puedo conectarte muchos más.

Puede que le resulte un poco intelectualmente desgarrador. Como en

  1. Encuentra "cuellos de botella" como los tiempos asociados a las rutinas. Las oportunidades de aceleración más valiosas a menudo no se manifiestan de esa manera. Son actividades que podrías describir fácilmente cuando las ves, pero son difusas. No concentran un tiempo significativo en una rutina o línea de código en particular, por lo que los diseñadores de perfiles no los ven.

  2. Las mayores oportunidades de aceleración pueden no ser del todo fáciles de arreglar. Pueden requerir una nueva forma de pensar cómo se organiza el programa. Si encuentras algo que puedes arreglar fácilmente, eso es genial. Adelante y hazlo. Si no se soluciona tan fácilmente, pero aún así le ahorrará mucho tiempo, si necesita ahorrar ese tiempo, debe hacerlo, le guste o no.

Buena suerte.

0

No tengo demasiada experiencia, pero una vez que he tenido ese problema. He comprobado mis rutas de inclusión y las he utilizado en el orden de las rutas de acceso de biblioteca utilizadas al máximo. y tengo casi un 30% de impulso. Creo que ya lo sabe, pero ha publicado cualquier forma ....... :)