Todos los que estamos en el mundo del Desarrollo Web siempre hemos visto un benchmark u otro. Lo que muchas veces se obvia es que muchos de esos benchmarks no sacan todo el jugo a las distintas tecnologías que se comparan, simplemente por una cuestión de tiempo y conocimiento sobre ellas. Y Symfony2 suele salir bastante perjudicado en los benchmarks, a pesar de que Symfony2 no es lento.

Los benchmarks parecen ser siempre el argumento definitivo en las temidas flame wars, cuando un fanboy de una tecnología se saca de la manga el rendimiento, muchas veces sentimos que es un argumento que no se puede discutir pero, ¿son siempre los benchmarks ciertos? Ya anticipo que es prácticamente imposible que lo sean.

Uno de los benchmarks que más circula por Internet es el siguiente de TechEmpower que resuelve una serie de problemas en más de un centenar de tecnologías y con un nivel de detalle asombroso. Aún así, es imposible poder desarrollar esa misma solución en igualdad de condiciones para tal cantidad de tecnologías y frameworks.

Centrándonos en el caso de Symfony2, el que haya experimentado un poco con él sabe que para ponerlo en producción con un buen rendimiento es necesario realizar unos ajustes para que mucho trabajo hecho por el framework se reutilice entre peticiones. Una de las optimizaciones más increibles de Symfony2 tiene que ver con su ORM por defecto, Doctrine2.

doctrine:
    orm:
        metadata_cache_driver: apc
        result_cache_driver: apc
        query_cache_driver: apc

Como podemos ver en el ejemplo anterior, se puede configurar diferentes tipos de caché para Doctrine2. La caché de metadatos (metadata_cache_driver) permite que todos los mapeos definidos en los ficheros de configuración de Doctrine2 sean reutilizados. Pero la opción que más acelera el rendimiento es query_cache_driver. Al habilitar esto, Doctrine2 solamente transforma una query de DQL a SQL una vez y, ya que esto requiere de un compilado y de la construcción de un AST interno, evita un trabajo titánico en cada petición. De todos modos, a efectos prácticos, en producción he llegado a ver una diferencia entre un segundo por petición a menos de 50 milisegundos. Un auténtico regalo para el rendimiento de tu aplicación. En el ejemplo se utiliza el motor de caché APC, pero existen otros motores de caché en Symfony2 que se pueden configurar a cualquier nivel de detalle.

Y este no es el único ajuste de optimización que se puede hacer. Existen centenares de recursos en Internet, como estas diapositivas o estas otras de Ricard Clau que detallan muchos más ajustes para tener las ventajas de utilizar una tecnología como Symfony2 a la hora de desarrollar sin tener que multiplicar el presupuesto en servidores.

He de admitir que yo mismo cometí ese mismo error en el post Benchmark de frameworks PHP, y que en un futuro próximo tengo intención de regenerar los resultados de ese benchmark con las opciones más sencillas posibles en Symfony2, para así enmendar mi error y ver como con poco esfuerzo se puede mejorar mucho el rendimiento.

Por último destacar que Symfony2 es un framework con un rendimiento más que aceptable para la cantidad de funcionalidades que aporta. Este post lo he escrito sobretodo debido a que, aunque menos que antes, sigue existiendo el mantra de que los frameworks son demasiado lentos, sin tener en cuenta cómo aceleran el proceso de desarrollo y facilitan el uso de patrones de diseño.