2011-07-03 13 views
12

Desde su página web http://www.playframework.org/documentation/1.0/faq¡Por qué jugar! marco eligió maravilloso para motor de plantillas

" El mayor consumo de CPU en la pila de juego en este momento es el motor de plantillas basado en Groovy. Pero a medida que las aplicaciones de juego son fácilmente escalables, no es realmente una problema si necesita atender un tráfico muy alto: puede equilibrar la carga entre varios servidores. Y esperamos un aumento del rendimiento en este nivel con el nuevo JDK7 y su mejor soporte de lenguajes dinámicos. "

Así que hay ¿No hay mejores opciones? ¿Qué hay de JSP?

+0

Nota: las plantillas groovy se reemplazarán en Play 2.0 (no recuerdo ahora cuál es la sustitución) – ripper234

+0

@ ripper234 Las plantillas se basarán en Scala: http://www.playframework.org/2.0 – romaintaz

+0

hay una implementación de plantillas groovy alternativo: http://www.playframework.org/modules/fastergt - es más rápido y usa menos memoria, y es compatible con play 2.0, por lo que le permitirá reutilizar sus plantillas ... – opensas

Respuesta

12

JSP no es factible ya que cada JSP se compila a un Servlet y la API servlet ofrece cosas como la sesión del lado del servidor que no son compatibles con el paradigma de descanso. No queremos volver a las épocas oscuras de las sesiones del servidor mal escalables, los problemas de abotonamiento en el navegador, los repositorios, etc.

Las plantillas Japid son interesantes, pero no están respaldadas por una gran comunidad y tal vez no Incluso existen en el momento en que se creó el juego (aunque no estoy seguro). Intenté con Japid como reemplazo de las plantillas de Groovy en mi propia aplicación y descubrí en una prueba de JMeter que el beneficio sería solo marginal, del 10% al máximo. 25% de mejora.

Supongo que al final todo depende de sus requisitos de escalabilidad y la estructura de sus páginas. Escogí el caso de uso del 90% de mi aplicación e hice la prueba. Para mí, la pequeña mejora no justifica los costos adicionales de la dependencia adicional (me gusta mantener las dependencias al mínimo para la mantenibilidad).

Las plantillas de Groovy no son malas ni lentas en general. Utilice variables tipadas siempre que sea posible (en lugar de "def"), ¡incluso en cierres! Mantenga los valores de las propiedades accedidas en las variables locales. Haga una búsqueda de resultados razonable. Luego mantenga sus dedos cruzados para que GSP pueda funcionar en Groovy ++ en el futuro y listo;)

Para mí, la pregunta no sería por qué usaron groovy en las vistas. Es decir, porque prefiero extrañarlo tanto en la capa de controlador. Groovy haría la codificación del comportamiento del controlador mucho más fácil en mi humilde opinión.

+0

¿Alguna vez ha probado el nuevo motor Rythm? Es tan rápido como Japid y es incluso más fácil de usar que Groovy. Consulte la demostración completa en http://rythmengine.com y el documento está disponible en http://playframework.org/modules/rythm –

4

Sí, hay Japid. Que es mucho, mucho más rápido.

http://www.playframework.org/modules/japid

+3

No lo juzgaría marco frente a otro basado en un solo micro banco. Estaba atrapado por ese micro banco para intentar Japid, pero al final no hubo ningún beneficio pequeño (diferencia máxima del 25%). Haga su propia prueba de su caso de uso más importante antes de cambiar. Además, las plantillas Japid no están tan bien integradas en la filosofía del juego como teóricamente sería posible. Por ejemplo, no veo por qué el código Java debe generarse en el sistema de archivos en lugar de generarse sobre la marcha como lo hace el juego durante la mejora de la clase. –

+1

Estoy de acuerdo con usted aquí. En mi empresa estamos utilizando una combinación de las plantillas de Groovy y jqote (plantillas de JavaScript). Solo estaba dando la respuesta alternativa. Este será probablemente el futuro de la creación de plantillas en el lado de Java. http://scala.playframework.org/documentation/scala-0.9.1/templates –

8

En primer lugar, JSP no era una opción válida para Play ya que optó por no bajar la ruta Java EE (de la cual JSP es parte). En cambio, Play eligió usar Groovy como un motor de plantillas intuitivo, simple pero poderoso.

Sin embargo, una de las mejores características de Play es que es un sistema conectable, lo que significa que muchas partes del sistema central pueden simplemente reemplazarse. Esto incluye el motor de plantillas, y hay un par que ya están disponibles.

El más popular es Japid. Se dice que es 2-20 veces más rápido que el motor de plantillas estándar, y ha existido por un tiempo. Para obtener más información, consulte aquí http://www.playframework.org/modules/japid.

Una segunda opción es Cambridge, aunque esto solo ha estado disponible por un tiempo, pero es bastante activo en los tablones de mensajes (ver https://groups.google.com/forum/?hl=en#!searchin/play-framework/cambridge/play-framework/IxSei-9BGq8/X-3pF5tWAKAJ).

Tiendo a apegarme a Groovy, como me gusta la forma en que funciona, y no me parece demasiado malo en términos de rendimiento, pero cada aplicación es individual, por lo que sus propias pruebas de rendimiento deberían guiarlo por su cuenta camino particular.

+1

Tenga en cuenta que el motor cambridge es adecuado solo para generación html/xml, no para tipos de documentos arbitrarios. –

2

Estoy totalmente de acuerdo con la elección de la facilidad con la velocidad que los diseñadores de Play Framework han creado aquí. Supongo que si la creación de plantillas comienza a estorbar en términos de rendimiento, puede (¡y debe!) Medir los bits lentos y, de ser posible, refactorizarlos en etiquetas rápidas. Con eso, es probable que guarde el 80% de la CPU moviendo el 20% en etiquetas rápidas, dejándole con flexibilidad y velocidad adecuada.

Habiendo dicho eso, estoy esperando un experimento Estoy planeando ver qué tan bien las nuevas plantillas de Scala ("prestadas" de Razor.NET - sintaxis de limpieza impresionante) funcionan con los controladores/modelos de Java. El back-end de Scala todavía no está ahí en términos de facilidad comparativa, pero el lenguaje de plantillas ciertamente se complica.

0

Puedo llegar tarde a la fiesta en 2016. Play 2 está fuera, y el JDK (sin mencionar el hardware) mejoró drásticamente. No estoy usando Play o Spring Boot, ya que mi plataforma no los necesita, solo generación de HTML/texto en tiempo de ejecución puro a partir de plantillas.

En primer lugar, cuando hablamos de plantillas de Groovy, hay más de una. Uso el Groovy SimpleTemplateEngine original para cualquier cosa, desde correos electrónicos hasta páginas web ricas, si la mayoría de las personas hoy en día prefieren el MarkupTemplateEngine "avanzado" con su sintaxis de constructor que no es HTML. No tomé esa ruta debido al soporte IDE (por ejemplo, UntelliJ) para archivos HTML JSPish con JavaScript, que capturan etiquetas sin abrir, llaves, etc. Además, ¿cómo incluiría JavaScript en la plantilla de estilo "generador" basada en llaves?

Cualquiera que elija, tanto SimpleTemplateEngine como MarkupTemplateEngine compilan estáticamente sus plantillas, aunque el documento de Groovy solo lo menciona para este último. ¿Por qué no generaría una clase para el primero? No los comparé uno contra el otro, pero esperaba que SimpleTemplateEngine fuera más rápido, ya que es ... bueno, más simple, no convierte ninguna sintaxis en concatenaciones de cadenas con ifs y loops intermedios.

Y de hecho es muy rápido. Estaba preocupado por invocarlo en un bucle. No hace ninguna diferencia. No hay sobrecarga, ya que la plantilla se compila una vez.

Utilizo varias plantillas pequeñas responsables de generar el marcado de control de formulario individual (HTML + JS) para generar un formulario compuesto, incluido en un contenedor de nivel superior, incluido en otro contenedor, y así sucesivamente, hasta que se forma toda la página . La descomposición de su vista de esa manera la hace, como ya ha adivinado, modular, encapsulada y "orientada a objetos", compuesta de muchos componentes MVC individuales que se complementan entre sí. Algo así como las buenas y antiguas etiquetas JSP personalizadas, solo evaluadas en tiempo de ejecución y compatibles con tecnologías como Spring Boot, si no puedes resistirte a cosas tan modernas como la promoción de currículums.

Una forma de prueba con 100 campos (todos los controles "inteligentes" complejos con gestión de estado encapsulado y comportamiento) se procesa en 150ms la primera vez, y luego 10-14ms después. En un depurador IDE en mi 4y.o. cuaderno. También verifiqué que es seguro para subprocesos, ya que Groovy nunca lo mencionó explícitamente. ¿Por qué no sería así si se compila en una clase Groovy sin estado como cualquier otra? Llame a createTemplate() una vez, almacene la plantilla en algún lugar, y úsela (llame a Template.make()) en su servlet u otro contexto concurrente. Obviamente, nunca tendré un formulario de 100 campos en una aplicación real. Cualquiera que lo haga, necesita reconsiderar su UX.

El rendimiento es bastante adecuado. Incluso aceptaría un segundo para renderizar una página de 100 campos. Piense en ello, no necesita el máximo rendimiento de nanotrading o rastreo de misiles nucleares en una aplicación web. Si lo hace, elija Jamon: http://www.jamon.org/Overview.html, que genera una clase Java, normalmente escribiría para concatenar cadenas. No lo probé, ya que no me gustan los pasos de compilación adicionales (ejecutados automáticamente por Maven, pero aún así). El código de bytes compilado de Groovy es lo suficientemente bueno para mí, en comparación con el Java compilado, sí, fuertemente tipado.La diferencia sería marginal a menos que esté haciendo algo complejo, que no debería dentro de una plantilla (ver a continuación). Jugar con variables Groovy tipadas contra def como se sugiere en este hilo, solo me salvó un par de milisegundos en esa ejecución de 100 plantillas.

Las plantillas no deben tener mucha lógica de procedimiento (variables internas, ifs y bucles) de todos modos, esa es la responsabilidad del controlador, no de la vista. Dicho esto, los ifs y los bucles son imprescindibles para un motor de plantillas. ¿Por qué uno usaría Manillar/Bigote, si él/ella simplemente puede llamar a String.replace()?

El resto de los motores de plantillas también es irrelevante. Ninguna concatenación de cadenas (por ejemplo, Velocity, o Freemarker) o tecnología basada en JS interpretada (por ejemplo, Jade) superarían alguna vez el enfoque de Jamon más directo en cuanto a rendimiento. Y al ser un programador de Java, desea utilizar su idioma/sintaxis favorita: ya sea directamente (Jamon) o en un 90% cerca de Java, Groovy es (al ser una Java conciso y centrada en scripting). No comentaría sobre Scala: el asunto de las preferencias. Aparte de su supuesta sintaxis "conciso" (menos y menos relevante con Java 8+) tiene un precio. Y solo importa para bucles complejos. No desea escribir toda su aplicación dentro de una plantilla, como ya he dicho. Un par de bucles y hasta diez declaraciones if max.

Y, como todos mencionaron, la sintaxis intuitiva y la facilidad de uso son la clave. Reducen drásticamente la cantidad de errores. Un buen servidor (adicional) cuesta $ 1000, mientras que los salarios de los desarrolladores: para arreglar todos los errores derivados de la complejidad de la optimización del rendimiento marginal, son 100 veces más altos.

Cuestiones relacionadas