Groovy Server Pages x FreeMarker Templates. Ambas são boas ferramentas, são mantidas por equipes extremamente qualificadas e estão disponíveis para Grails (FreeMarker através dos plugins freemarker e freemarker-tags).
Conforme já mencionado anteriormente, microbenchmarks são apenas microbenchmarks. Os testes a seguir foram motivados por uma antiga discussão sobre a renderização de templates dinâmicos e pelo recente tópico sobre o desempenho de renderização de vários frameworks web.
Seguem-se os resultados obtidos, para o cenário particular do tópico em questão:
Apache HTTP server benchmarking tool (ab)
-
GSP
Document Path: /grailsapp/products
Document Length: 1037698 bytesConcurrency Level: 30
Time taken for tests: 383.757685 seconds
Complete requests: 3000
Failed requests: 0
Write errors: 0
Total transferred: 3113592000 bytes
HTML transferred: 3113094000 bytes
Requests per second: 7.82 [#/sec] (mean)
Time per request: 3837.577 [ms] (mean)
Time per request: 127.919 [ms] (mean, across all concurrent requests)
Transfer rate: 7923.27 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.1 0 14
Processing: 2105 3829 380.8 3831 5122
Waiting: 2097 3824 381.0 3825 5120
Total: 2105 3829 380.9 3831 5122Percentage of the requests served within a certain time (ms)
50% 3831
66% 3987
75% 4092
-
FTL
Document Path: /grailsapp-fm/products
Document Length: 1026697 bytesConcurrency Level: 30
Time taken for tests: 103.94286 seconds
Complete requests: 3000
Failed requests: 0
Write errors: 0
Total transferred: 3080604000 bytes
HTML transferred: 3080091000 bytes
Requests per second: 29.10 [#/sec] (mean)
Time per request: 1030.943 [ms] (mean)
Time per request: 34.365 [ms] (mean, across all concurrent requests)
Transfer rate: 29181.07 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 74 1027 646.1 962 4373
Waiting: 71 988 643.3 915 4006
Total: 74 1027 646.1 962 4373Percentage of the requests served within a certain time (ms)
50% 962
66% 1212
75% 1376
Informações relevantes:
- As aplicações foram iniciadas usando-se ‘grails prod run-war’;
- Para a execução do Apache benchmarking foi usado o comando ‘ab -n 3000 -c 30 URL’;
- O arquivo de configuração do JMeter pode ser encontrado aqui;
- Os resultados completos encontram-se aqui;
- O desempenho de renderização dos GSPs foi melhorado na versão 1.4 de Grails: GRAILS-7582.
Referências adicionais:
Muito bom!
Agora entra outros critérios, como manutenibilidade e facilidade de uso, e o peso que você dá a cada um deles.
Como se cria uma tagLib com FTL?
Meu melhor conselho seria que você testasse ambas as opções. Elas não são mutuamente exclusivas. Você pode ter páginas em .gsp e .ftl na mesma aplicação, da mesma forma que tem .jsp e .gsp.
Minha escolha pessoal ainda é o FreeMarker. A atualização, após cada alteração do .ftl, é instantânea e a sintaxe é simples.
Em relação às tagLibs, é aí que entra o plugin do freemarker tags: Você escreve sua Grails Dynamic TagLib da forma usual (http://grails.org/doc/latest/guide/single.html#6.3%20Tag%20Libraries) e ela fica “disponível” no seu template .ftl:
ou
As tags “core” também ficam disponíveis automaticamente. Aqui tem um exemplo de um login.gsp “convertido” para login.ftl:
http://grails-freemarker-tags-plugin.googlecode.com/svn/doc/manual/guide/1.%20Introduction.html
Daniel, muito obrigado! Comentário de muito valor.
IMO a grande vantagem do Grails são as taglibs, então se eu puder manter e precisar alcançar um desempenho maior em alguma situação, posso utilizar FreeMarker. Uau!
Tem alguma outra vantagem a não ser preferência pela sintaxe e desempenho?
Eu trabalhei em uma empresa na qual as views eram feitas por designers e programadores de outras linguagens, como PHP, por exemplo. Para eles, a sintaxe usada pelos template engines (Velocity e FreeMarker) eram mais naturais que JSP e, provavelmente, que GSP. Como foi há muito tempo, não havia Grails ainda
Além disso, para maximizar o reuso, eles podiam escrever macros, sem precisarem programar em Java. As macros são muito poderosas porque elas se parecem com (e agem como) tags.
Outro ponto interessante é essa capacidade de escaping: http://freemarker.sourceforge.net/docs/ref_builtins_string.html#ref_builtin_xhtml
Claro que muitas das características de FreeMarker são “pré-Groovy”, então acabam sendo um maior diferencial frente ao desenvolvimento usando JSP (JEE “regular”) do que frente ao desenvolvimento usando GSP (Grails).
Claro que não é um exemplo significativo, mas você pode ver uma biblioteca de macros (é possível ter mais de uma macro no mesmo arquivo) e sua utilização aqui:
https://github.com/daniel-lima/blogpost_files/blob/master/grailsapp-fm-1.3.7/grails-app/views/products/index.ftl
https://github.com/daniel-lima/blogpost_files/blob/master/grailsapp-fm-1.3.7/grails-app/views/shared/_product.ftl
Existe até a possibilidade de “auto-importar” tais bibliotecas. Dessa maneira, o ‘[#import "../shared/_product.ftl" as prod]‘ não seria mais necessário.
http://grails.1312388.n4.nabble.com/ANN-FreeMarker-Tags-0-6-1-tp3599837p3599837.html
Outra vantagem do FreeMarker é a possibilidade de criação de macros: http://freemarker.sourceforge.net/docs/dgui_misc_userdefdir.html
Excelente! Ótimos argumentos!
A propósito, lembrei de você ao ler o artigo abaixo – do qual não tenho grande expertise mas muito interesse.
http://blog.dynatrace.com/2011/06/08/why-response-times-are-often-measured-incorrectly/
Se você pudesse postar sobre o assunto seria ótimo!
Só de ler alguns trechos desse artigo, já me lembrei de algo interessante que aconteceu enquanto eu reproduzia os testes do GSP x FTL:
Nessa postagem do Chee Kin, como o teste era feito via JavaScript, o desempenho “percebido” estava mais próximo do que um usuário realmente experimentaria. Nesse caso, o limitante inferior, se o cliente e o servidor fossem o mesmo computador, seria o tempo de renderização do browser. Então, diferenças de milésimos de segundo não seriam percebidas, se o browser demorasse segundos para renderizar a página.
Já nessa postagem, não. Ao reproduzir os testes executados pelo autor, a minha única curiosidade era saber como os FTLs se comportariam, quando comparados aos GSPs, e qual seria a capacidade de resposta da aplicação a requisições simultâneas. Eu não tinha nenhuma pretensão maior do que essa
Daniel,
FreeMarker em um macro-benchmarking é melhor ainda!
Veja só, sugeri a adição e olha o que aconteceu. EXCELENTE!
http://www.jtict.com/blog/rails-wicket-grails-play-lift-jsp/
Tô muito impressionado! Muito mesmo!
Gostaria de te agradecer muito pela sugestão!
Sem dúvida vou me basear no FreeMarker nas próximas arquiteturas.
Go Grails Go!
Oi Wanderson.
Gosto bastante do FreeMarker. Só sugiro executar mais testes antes para saber em quais situações/tipos de página ele será mais rápido que o GSP, principalmente se você estiver usando o freemarker-tags plugin. Digo isso porque o freemarker-tags é um wrapper sobre as GSP TagLibs e, dessa maneira, é esperado que, na média, ele seja mais lento quando comparado com a utilização direta das mesmas tags. Claro que não é nada que não possa ser melhorado com o tempo.
Obrigado por acompanhar o blog.
[]‘s.