Melhorias em tempo de resposta!

4 respostas
R

Pessoal,

Estou desenvolvendo uma aplicação que faz leitura em um arquivo txt não indexado de +/- 13MB. E o resultado é exibido em um JTable.

Segue a ideia:

O carregamento é disparado pelo evento do JFileChooser quando clicado no botão OK. Então é disparada uma thread que processa o arquivo/linhas e armazena as mesma em um Vector. Foi necessário executar a aplicação com os parametros -Xms e -Xmx para não ter perda de dados devido os heap swap.

O arquivo que o sistema lê tem o seguinte padrão:

cabeçalho1
cabeçalho2
parametros1
parametros2
parametros3
parametros4
parametros5
hora1
valor1
valor2
valor3
valor4
valor5
hora2
valor1
valor2
valor3
valor4
valor5
hora3
valor1
valor2
valor3
valor4
valor5

hora23
valor1
valor2
valor3
valor4
valor5

Ao todo são 3800 parametros com valores coletados a cada 5 minutos em 24 horas totalizando 1094400 em valores e 1098204 linhas no final das contas. Até o momento o algoritmo usando a classe Vector termina o processamento em 4s.

Gostaria de saber a opinião quanto ao uso da classe Vector e outras semelhantes que possam melhorar no desempenho da aplicação.

Também gostaria de saber como acrescer ao MANIFEST.MF os parametros -Xms e -Xmx. É possível?

Qualquer ajuda é bem vinda!

Abraços

4 Respostas

Y

Bom… por padrão a classe Vector é sincronizada, assegurando a não perda de dados caso múltiplas threads acessem um objeto deste tipo. Entretanto, a sincronização de um Vector acarreta na perda de performance, de modo que coleções Vector tendem a ter um desempenho consideravelmente menor que o de uma List comum.

Portanto, se o seu *.txt está sendo acessado por somente uma thread (como acredito ser o caso) poder-se-ía ser conveniente usar uma List ao invés de Vector.

P

cara…
Quais classes vc esta usando para manipulação do arquivo ?

Utilize as classes do pacote java.nio http://java.sun.com/j2se/1.4.2/docs/guide/nio/

ViniGodoy

Sempre que tiver dúvidas de performance use um profiler. Tanto o Netbeans quanto o Eclipse tem ótimos profilers e existem até algumas versões independentes de IDE no mercado.

O profiler vai te indicar exatamente onde o seu código perde mais tempo. Você pode concentrar seus esforços em otimizar os métodos certos, ganhando performance significativamente. É muito melhor do que tentar otimizar empiricamente. Dê uma olhada nesses tópicos:
http://www.guj.com.br/posts/list/48226.java#252450
http://www.guj.com.br/posts/list/48226.java#253071

Não creio que o Vector acarrete num problema de performance tão significativo assim, embora ele certamente seja mais lento que um List. Ainda assim, eu recomendo a troca por um List. O List é mais simples de usar, mais flexível e pode ser sincronizado caso haja necessidade.

Veja também a forma com que você está lendo o arquivo. Geralmente, problemas de performance em aplicações desse tipo estão no I/O.
Dá uma olhada nesse artigo:
http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/

Considere também utilizar as classes do pacote Java.NIO.

Outras dicas de performance tunning podem ser encontradas no site:
http://www.javaperformancetuning.com/tips/index.shtml

Finalmente, o profiler pode te indicar problemas de performance na montagem da JTable. Especialmente se a sua table calcula dinamicamente o tamanho das colunas. A sugestão para melhorar isso é deixa-las com tamanho fixo.

R

Seguinte, mudei para a Classe ArrayList e já tive um retorno bom. Quanto as classes de acesso ao arquivo estou usando estou usando a java.io.
Vou ver como aprender a usar o profile e fazer os testes comparativos.
Obrigado pela ajuda de todos
Abraços

Criado 6 de fevereiro de 2007
Ultima resposta 9 de fev. de 2007
Respostas 4
Participantes 4