for - ¿Cuál es el costo de rendimiento de "incluir" en PHP?
twig document (3)
APC lo ahorrará mucho, pero no sé si será insignificante si su fuente es de 600k. Eso es alrededor de 15000 líneas de código? No mucho para un sitio web, pero bastante grande para un solo archivo.
Prefiere utilizar un enfoque más dinámico y una funcionalidad específica de aislamiento en clases específicas. Luego, para cada página, puede elegir qué código es necesario.
Especialmente cuando utiliza APC, este enfoque será mejor, ya que no tiene la sobrecarga de E / S de archivos que tendrá cuando carga muchos archivos pequeños desde el disco. Yo elegiría implementar clases pequeñas y específicas y poner cada una de ellas en un archivo separado. Puede usar el mecanismo de carga de clase PHP (__autoload) para cargar automáticamente las unidades correctas.
Cuando descubra una buena convención de nombres para sus clases y unidades, esto facilitará mucho su desarrollo.
Solo me pregunto si alguien tiene información sobre los "costos" asociados con la inclusión de un archivo php GRANDE (600K o más) que contiene cientos de archivos de clase. ¿Realmente hace mucha diferencia en comparación con los archivos individuales autocargados que, por ejemplo, busca en varios directorios antes de encontrar una coincidencia?
¿Tener el almacenamiento en caché de APC hace que este costo sea insignificante?
Básicamente, el costo de incluir un archivo grande depende de su uso. Digamos que tienes un archivo grande con 200 clases.
Si solo usa 1 clase, incluir el archivo grande será más costoso que incluir un pequeño archivo de clase para esa clase individual.
Si usa las 200 clases, incluir el archivo grande será significativamente menos costoso que incluir 200 archivos pequeños.
Donde se encuentra el punto de corte realmente depende del sistema. Imaginé que estaría en algún lugar alrededor de la marca del 50% (donde si estás utilizando menos de 100 clases en una sola solicitud, autocarga).
Y usar APC probablemente desplazará el punto de equilibrio más cerca de menos clases (así que sin, 100 clases utilizadas podrían ser el punto de equilibrio, pero podría ser de hasta 50 clases) ya que hace que el gran solo sea mucho más barato, pero solo baja el sobrecarga de cada individuo más pequeño incluye ligeramente.
Los puntos de equilibrio exactos dependerán en un 100% del sistema (qué tan rápido es su E / S de disco, qué tan rápido son sus procesadores, cuánta memoria, etc.). Entonces, la única forma de saber con certeza en su plataforma es probar.
Sin embargo, hay más en juego que el rendimiento en bruto. La capacidad de mantenimiento se verá afectada con un archivo grande, ya que es más difícil trabajar en múltiples clases al mismo tiempo (las pestañas en un IDE se vuelven inútiles). Personalmente mantendría todas las clases en archivos separados y haría mi vida más fácil como desarrollador en lugar de hacer una monstruosidad gigante de un archivo.
Ahora, si tiene niveles de tráfico de Facebook, puede valer la pena investigar más. Pero si no lo eres, personalmente no me preocuparía ...
He realizado algunas pruebas sobre los diversos costos de php include()
que me gustaría compartir, ya que veo muchos programadores o plataformas CMS que pasan por alto estos costos de PHP previos a la ejecución.
El costo de la función en sí es bastante insignificante. 100 archivos incluyen (con archivos vacíos) cuesta alrededor de 5 ms; y no más de un microsegundo al usar un opcache.
Por lo tanto, el ahorro de costos de incluir un archivo php más grande que contenga 100 clases, a diferencia de 100 archivos incluidos, es de solo 5 ms. Y usar un caché OpCode hace que ese costo sea irrelevante.
El costo real viene con el tamaño de tus archivos, y lo que PHP tiene que analizar y / o compilar. Para tener una mejor idea de cuáles son esos costos, aquí están los resultados de las pruebas que realicé en un Mac Mini Server 2010, con una unidad de 10,000 RPM, ejecutando PHP 5.3 con un opcache eAccelerator optimizado.
1µs for 100 EMPTY File includes, w/opcache
5ms for 100 EMPTY File includes, no opcache
7ms for 100 32KB File includes, w/opcache
30ms for 100 32KB File includes, no opcache
14ms for 100 64KB File includes, w/opcache
60ms for 100 64KB File includes, no opcache
22ms for 100 128KB File includes, w/opcache
100ms for 100 128KB File includes, no opcache
38ms for 100 200KB File includes, w/opcache
170ms for 100 200KB File includes, no opcache
Por lo tanto, un archivo php de 600 KB cuesta aproximadamente 6 ms, o aproximadamente 1 ms cuando se utiliza un caché de código de operación. Lo que realmente quieres ver es el tamaño de todo el código incluido por solicitud.
Combinar archivos en combos para intentar guardar recursos definitivamente no es una buena idea y sería un error al usar un op-cache. Mi prueba no representa mucho la velocidad del disco, si es que lo hago, ya que incluí el mismo archivo 100 veces. Dicho esto, no siento la necesidad de cubrir las E / S de disco en absoluto, porque tener un op-cache instalado es realmente un requisito previo en términos de rendimiento básico.
Para obtener el mayor rendimiento posible y ahorrar el uso de RAM, uno debe hacer lo contrario. Que es dividir los archivos contextualmente tanto como sea posible, con el uso de un autocargador o un patrón de fábrica de clase, para incluir el menor código no utilizado posible para cada solicitud.
A ese efecto, el uso indebido de include_once()
también puede tener consecuencias negativas en el rendimiento ...
En lo que respecta a tus clases base. Tengo circunstancias similares, pero solo incluyo una pequeña porción del esquema de la tabla. Principalmente los tipos de campo y los detalles de la clave principal. Por razones de rendimiento, intencionalmente no incluyo el esquema bastante pesado de las tablas todo el tiempo, porque rara vez se usan y, cuando lo son, solo uso un par de ellas como máximo por solicitud.
Los detalles de la columna completa promedio de una tabla son aproximadamente 20-50 k por matrices de esquema. Incluir 10-15 de ellos en cualquier solicitud dada cuesta aproximadamente 1-3 ms para las matrices. Que en sí mismo, no es mucho. Pero vale la pena cuando se combina con un ahorro de 500k RAM por solicitud.