September 28th, 2008
Durante o desenvolvimento da engine do myFuses, dois detalhes são considerados de forma quase compulsiva:
- A performance está aceitavel?
- É possível ficar mais rápido?
Em relação a segunda preocupação eu sempre trabalho de forma pessimista, pois ao fazer os testes de velocidade, tento correr atrás de centésimos de segundo.
Mudando de assunto, para depois voltar de novo a ele, dois colegas meus, no Ministério do Meio Ambiente, fizeram um gerador de código para aplicações utilizando iFlux/myFuses, que a partir de um banco de dados( bem modelado ), telas básicas são construídas com as o CRUD funcional para cada entidade(tabela) do banco funcional. Este gerador de código trabalha analizando até tabelas de relacionamento.
O produto gerado contém um DAO bem estruturado, templates do smarty, circuitos completos, fachadas de negócio e arquivos de configuração do iFlux/myFuses.
O que isto tem a vem com a velocidade do myFuses? Tudo, pois em um dos testes de uma aplicação com mais de 117 tabelas, foi descoberto que nem a performance do myFuses não estava aceitavel, para aplicações com um grande número de circuitos, lembrem-se para cada tabela do banco, a aplicação gera um circuito, ou seja foram gerados mais de 117 circuitos. Ao rodar esta aplicação, cada requisição ficava demorava 20 segundos.
Qual o motivo desta demora? O myFuses 0.9.6, apesar de ser muito mais rápido que todas as versões anteriores, trabalha da seguinte forma, carrega o myfuses.xml, para cada circuito, ele carrega seus respectivos circuit.xml, para depois processar a requisição.
No caso da aplicação gerada, o arquivo de cache de meta dados ficou com quase 13Mb e quando subia para memória, esses metadados ultrapassavam 23 Mb. Ou seja para aplicações de com muitos circuitos( mais que 80 ) o myFuses estava muito lento, mas estável.
Pensei que fosse difícil resolver o problema, mas em duas semanas, só alterando alguns métodos da engine de lugar, conseguimos modificar o carregamento do circuito, agora ele é feito por demanda, ou seja, se uma tela utiliza 3 circuitos, o myFuses só carrega os 3 circuitos na memória, além de armazenar esses meta-dados em arquivos diferentes, um para cada circuito, em vez de um arquivão para todos.
O resultado dos testes desta estratégia na aplicação gerada foi 2s de execução, mantendo a estabilidade, para uma pesquisa que retorna mas de 120000 registros paginados. A performance está aceitavel para aplicações grandes. Mas e para aplicações pequenas? Um teste em uma aplicação de médio porte foi, de 1,6 segundos, ela passou a rodar em 0,9 segundos. Em uma aplicação pequena não será possível ver uma melhora significativa, acho que fique até mais lento, mas a idéia de rodar melhor em aplicações de médio/grande porte é bastante animadora.
Se dá pra ficar mais rápido? Acho que sim. Esta a versão 0.9.7 será a primeira vesão a utilizar esta estratégia, com a prática, será possível encontrar algumas possibilidades de melhora, já estou bem feliz com o resultado atingido, que bom que esse teste do gerador foi realizado, sem ele só seria possível realizar o teste no final do produto.
Dia 22 de outubro de 2008 22 de dezembro de 2008 estará disponível a vesão 0.9.7 para download, confiram.
Nota:
Os testes foram realizados em uma máquina rodando windows, e meio mundo de anti-vírus, aplicações de controle de software corporativo, em fim aquele bando de sistema que fica rodando por trás de uma máquina windows e ocupando o segundo processador de um dual core. Estes valores em uma máquina linux/unix em ambiente de produção seriam bem melhores. Depois farei um benchmark mais ciêntífico entre a versão 0.9.6 para a 0.9.7.
Compartilhe/Share:
These icons link to social bookmarking sites where readers can share and discover new web pages.
Posted in iFlux, myFuses | 2 Comments »