De que se trata o artigo:

Apresentação de um conjunto de dicas e macetes de otimização para aplicações Java ME, além da introdução das ferramentas de monitoração de memória/desempenho, disponíveis na plataforma. Neste artigo, as dicas são apresentadas de forma clara, com números reais, que comprovam a sua efetividade.


Para que serve:

Proporcionar uma apresentação objetiva de algumas valiosas dicas sobre otimização de aplicações Java ME. Esta apresentação concede ao leitor uma série de alternativas simples, mas efetivas, na busca por melhores resultados, em termos de memória e velocidade de processamento, de suas aplicações.


Em que situação o tema é útil:

No momento em que percebemos que o desempenho de nossa aplicação precisa melhorar, pois o seu tempo de resposta não está sendo como esperado. Para isto, o conhecimento das ferramentas de monitoração nos permitirá encontrar esses “gargalos” com mais facilidade, enquanto que as técnicas (dicas e macetes) nos possibilitarão desenvolver alternativas que irão contornar e resolver os problemas encontrados.

Tuning ME:

Para deixar o nosso automóvel mais potente, sempre recorremos às oficinas mecânicas para que possamos identificar as peças certas a serem ajustadas e/ou modificadas, a fim de obtermos o resultado desejado. O mesmo acontece com o software. Quando este precisa ser mais eficiente, identificamos as partes do código que estão lentas, para então, desenvolvermos uma solução para resolver o problema.

O software pode sofrer tanto problemas de desempenho relacionados ao alto consumo de memória, quanto relacionados à ineficiência do algoritmo em si, pois este pode possuir passos desnecessários para a conclusão do seu resultado. Por isto é importante termos em mente algumas dicas e macetes de otimização. Assim podemos aplicá-las já durante o desenvolvimento ou num momento posterior de refinamento de um trabalho já concluído. Além disso, saber utilizar bem as ferramentas de monitoração nos permite salvar um bom tempo na fase de identificação dos “gargalos”.

Com um conjunto de dicas e ferramentas de otimização, podemos observar que as chances de surgimento de “gargalos” tendem a diminuir, devido a sua efetividade, pois os números mostram este ganho. O objetivo é que este conhecimento seja solidificado de forma que a tarefa extra de desenvolvimento seja bem menor, e que desde a primeira versão do código, este já possua um desempenho satisfatório aos objetivos do software.

Gargalo: O “gargalo” é um determinado trecho de um processamento que demora muito para ser executado, afetando o tempo final de resposta de um processo.

A expressão Tuning (do Inglês, “afinação”) consiste na prática de modificar ou afinar as características de uma determinada coisa, a fim de se obter um melhor resultado dela. Atualmente, a utilização desta expressão pode ser encontrada em diversas áreas, como por exemplo, na automobilística. No Brasil, como em outros países, a prática de “tunar” automóveis, ou seja, modificar elementos de um automóvel de linha, tem se difundido bastante.

O movimento Tuning, no mundo, ganhou muito mais força a partir de 2001, após o lançamento do filme: “Velozes e Furiosos”.

Neste caso, estas modificações podem ir desde simples elementos visuais (e.g. cor), chegando aos componentes mecânicos (e.g. motor). A idéia é transformar um automóvel de visual e potência simples, num automóvel mais bonito e potente.

Outra área em que o Tuning é bem presente é a de desenvolvimento de software. O software, à medida que evolui ou se suas demandas atuais aumentem, pode precisar sofrer modificações, para que um novo objetivo seja atingido. Há também a situação, onde durante o desenvolvimento de um novo software, algumas medidas já devem ser tomadas pelo desenvolvedor, a fim de respeitar restrições impostas, muitas vezes, pelo ambiente de execução. Por exemplo, o ambiente de execução de um dispositivo móvel é bem restrito em memória e poder de processamento. Com isto, os desenvolvedores de aplicações móveis precisam ter sempre em mente que, todo o código produzido por eles, deve usar o mínimo de memória e processamento possível.

Neste artigo, mostraremos como os desenvolvedores Java ME podem construir códigos mais performáticos, ou então, “tunar” aquele velho algoritmo que anda consumindo muita memória. Também veremos como as ferramentas de monitoração de memória e processamento (profilers), disponíveis no Wireless Toolkit, Netbeans Mobility Pack e Java ME Platform SDK 3, podem nos ajudar, quando sentimos que o desempenho de nossa aplicação precisa melhorar. Além de tudo isto, apresentaremos no final, uma tabela comparativa que mostra os números de algoritmos não otimizados, em comparação a outros já otimizados com as dicas apresentadas.

Esqueça o Motor 2.0

Um ponto que sempre saliento antes de iniciar a falar sobre otimização em aplicações móveis, e principalmente quando falo com desenvolvedores recém chegados do “mundo” desktop ou web, é que a aqui, a estória é outra. A quantidade de memória e poder de processamento são reduzidos, tendo em vista à miniaturização do hardware. Continuando a analogia, um dispositivo móvel é como se fosse um automóvel com um motor de 1000 cilindradas: compacto e com pouca potência.

No caso dos novos desenvolvedores, a ordem é esquecer a “farra” de criação de objetos, abstrações, camadas, interfaces, etc. Uma série de práticas que exercemos, e que muitas vezes não geram problemas de desempenho, pois dispomos de alguns gigas de memória em nossos computadores, mas se empregadas em ambientes restritos podem causar dores de cabeça.

No desenvolvimento de aplicações móveis, independente da plataforma utilizada, as preocupações com o consumo de memória e/ou CPU devem ser levados muito a sério, seja num simples algoritmo ou na arquitetura em si de uma aplicação. Qualquer medida tomada durante o desenvolvimento, relacionado a estes dois fatores, fará com que as chances de surgimento de “gargalos” ou erros de falta de memória, durante o ciclo de vida da aplicação, diminuam. A idéia é esquecer aquele potente motor 2.0, e se acostumar às retomadas lentas, características dos automóveis 1.0.

Design Compacto

A definição da arquitetura de uma aplicação móvel, assim como a dos seus componentes, também deve levar em conta as restrições presentes num dispositivo móvel. Ainda mais quando a linguagem de desenvolvimento utilizada é orientada a objetos, como é o caso da Java. Embora as críticas às linguagens OO já tenham sido superadas quando se fala de aplicações desktop ou web, a discussão ainda é pertinente para aplicações móveis.

A modelagem orientada a objetos facilita muito o projeto das aplicações, pois através dos seus conceitos fundamentais, como herança, encapsulamento e polimorfismo, aplicações de complexidade crescente podem ser construídas com maior facilidade, pois estes recursos de OO promovem o reuso e o particionamento de sistemas complexos em partes menores mais tratáveis.

No entanto, é o abuso destes conceitos que pode comprometer o desempenho de uma aplicação. Somos tentados a abstrair muito as funcionalidades, ao criar muitas classes, interfaces e camadas. Também evitamos usar tipos primitivos, preferindo objetos; quebramos um comportamento simples em vários métodos, e assim por diante. Tudo isto somado, torna-se uma estrutura muito grande e dispendiosa para se sustentar.

A idéia para se ter uma arquitetura “enxuta”, para se executar satisfatoriamente num dispositivo móvel, é tentar manter as coisas o mais simples possível. Entretanto, esteja preparado para a possibilidade de negligenciar alguns conceitos de OO, tendo em vista a procura por desempenho (veja o quadro “Otimização X Legibilidade”). Uma das primeiras coisas a se fazer para “enxugar” a modelagem é reduzir o número de classes, interfaces e camadas. Atenção ao uso de padrões de projeto! Quanto mais classes e interfaces, mais memória é preciso para mantê-las carregadas. Por mais que o ...

Quer ler esse conteúdo completo? Tenha acesso completo